Состояние доступа из компонента в другой вкладке в React native

В моем приложении у меня есть два компонента на разных вкладках, BookShelf и AddBook. BookShelf содержит плоский список книг, добавленных пользователем, и моя идея с AddBook - найти книги и нажать кнопку, чтобы добавить их в список в компоненте BookShelf.

Моя идея состоит в том, чтобы хранить книги в виде объектов в массиве в состоянии BookShelfs. Можно ли получить доступ к состоянию BookShelf из AddBook и как мне это сделать? Я попытался создать функцию в BookShelf, которая обновляет состояние и передает его как реквизиты в мой компонент AddBook, но безуспешно, так как мне приходится визуализировать компонент AddBook в BookShelf для прохождения реквизитов.

Прямо сейчас я использую TabNavigator для вкладок, где отдельные вкладки StackNavigator вкладываются во вкладки.

Древовидная структура:

START: App.js -> TabsNavigator -> TABS: Книжная полка и AddBook

TAB 1: BookShelf -> STACK: BookShelfStack -> КОМПОНЕНТЫ: BookShelf & BookInfo

TAB 2: AddBook -> STACK: AddBookStack -> КОМПОНЕНТЫ: AddBook

Router.js, обрабатывающий навигацию:

export const BookShelfStack = createStackNavigator({
BookShelf: {
    screen: BookShelf,
    navigationOptions: {
        title: 'Book Shelf',
    }

},

BookInfo: {
    screen: BookInfo,
    navigationOptions: {
        title: 'Book Info'
    }
},   
})

export const AddBookStack = createStackNavigator({
AddBook: {
    screen: AddBook,
    navigationOptions: {
        title: 'Add Book',
    }
}

})

export const TabsNavigator = createMaterialTopTabNavigator({

'BookShelf': {
    screen: BookShelfStack,
    navigationOptions: {
        tabBarLabel: 'Book Shelf',
        tabBarIcon: ({tintColor}) => <Icon name="ios-book" type="ionicon" size={28} color={tintColor}/>
    }
},

'AddBook': {
    screen: AddBookStack,
    navigationOptions: {
        tabBarLabel: 'Add Book',
        tabBarIcon: ({tintColor}) => <Icon name="ios-add-circle-outline" type="ionicon" size={28} color={tintColor}/>
    }
},
});

Компонент BookShelf с данными-заполнителями прямо сейчас:

export default class BookShelf extends Component {

constructor(props) {
super(props);
this.addBook = this.addBook.bind(this);

this.state = {

    books: [
        {
            id: 1,
            title: 'Harry Potter and the Goblet of Fire',
            author:'J.K. Rowling',
            thumbnail:'https://covers.openlibrary.org/w/id/7984916-M.jpg',
        },

        {
            id: 2,
            title: 'The Hobbit',
            author: 'J.R.R. Tolkien',
            thumbnail:'https://covers.openlibrary.org/w/id/6979861-M.jpg'
        },

        {
            id: 3,
            title: '1984',
            author: 'George Orwell',
            thumbnail:'https://covers.openlibrary.org/w/id/7222246-M.jpg'
        }

    ]
}
}

renderBook = ({item}) => (

    <BookShelfItem
    navigation={this.props.navigation}
    id={item.id}
    title={item.title}
    author={item.author}
    thumbnail={item.thumbnail}
    />
);

addBook(book) {

    let updatedBookList = this.state.books.slice();
    updatedBookList.push(book);

    this.setState({
        books: updatedBookList    
    });
}

render() {
    const {container} = styles;
    <AddBook addBook={this.addBook}/>
    return (
        <View style={container}>
        <StatusBar barStyle="light-content"/>
         <FlatList
        data={this.state.books}
        keyExtractor={(item, index) => item.id.toString()}
        renderItem={this.renderBook}
        extraData={this.state.books}
        /> 
        </View>

    );
}
}

Компонент AddBook, где я пытаюсь получить функцию addBook в качестве реквизита из BookShelf:

export default class AddBook extends Component {

constructor(props) {
super(props)
}

render() {
    const {container, title, textInputStyle} = styles;
    const { addBook } = this.props;
    return (
        <View style={container}>
        <Text style={title}>
        Add Book
        </Text>
        <TextInput style={textInputStyle}
        placeholder = {'Search books..'}
        />
        <Button 
        title = "Add book"
        onPress={() => addBook}

        />
        </View>
    );
}
}

0 ответов

Другие вопросы по тегам