В React Native и Redux я использую <NavigationCardStack/>
в качестве корневого компонента и визуализирую маршруты с помощью _renderScene()
. Но, похоже, всякий раз, когда корневой компонент повторно обновляется с обновлением состояния, он не передает состояние каждого обновления, потому что я помещаю console.log(this.props)
в дочерний компонент и регистрирует переданное состояние, но он регистрируется только один раз, и это первый раз, когда приложение запускается и никогда не регистрируется, даже если корневой компонент повторно отображается с обновлением состояния.React Native/Redux: Как передать обновленное состояние дочерним компонентам при каждом изменении состояния?
Почему он не передает обновленное состояние при каждом изменении состояния? И почему не реинкарнация дочернего компонента всякий раз, когда выполняется корневой компонент?
Это мой набор вверх:
_renderScene (props) {
const { route } = props.scene
return (
<route.component _handleNavigate={this._handleNavigate.bind(this)} state={this.props}/>
)
}
<NavigationCardStack
direction='horizontal'
navigationState={this.props.navigation}
onNavigate={this._handleNavigate.bind(this)}
renderScene={this._renderScene}
renderOverlay={this.renderOverlay}
style={styles.container}
/>
В _renderScene
, props
одни журналы:
И this.props
регистрирует фактически состояние передается через Redux:
И в детском компоненте childPage.js
, я просто войти как это так, и он записывает реквизит передающийся (_handleNavigate
и state
) правильно, но state
только продолжает представлять исходное состояние, даже если он получает обновление:
render() {
console.log(this.props.state)
return (
Спасибо заранее!
EDIT
Это мой редуктор и компоненты ребенка будет просто войти в InitialState здесь, даже если были добавлены другие свойства и обновления:
const initialState = {
meetUp: false,
}
function itemReducer(state = initialState, action) {
switch(action.type) {
case ITEM_QUANTITY:
return {
...state,
quantity: action.quantity
}
case ITEM_PRICE:
return {
...state,
price: action.price
}
case ITEM_MEET_UP:
return {
...state,
meetUp: action.meetUp
}
default:
return state
}
}
export default itemReducer
И подключены к корневой компонент, как так :
function mapStateToProps(state) {
return {
itemInfo: state.itemReducer,
...
}
}
export default connect(
mapStateToProps,
{
itemQuantity: (value) => itemQuantity(value),
itemPrice: (value) => itemPrice(value),
itemMeetUp: (value) => itemMeetUp(value),
}
)(NavigationRoot)
С следующих действий:
export function itemMeetUp(value) {
return {
type: ITEM_MEET_UP,
meetUp: value
}
}
export function itemQuantity(value) {
return {
type: ITEM_QUANTITY,
quantity: value
}
}
export function itemPrice(value) {
return {
type: ITEM_PRICE,
price: value
}
}
Извините, но вы можете показать пример того, как «принудительно активировать»? Никогда раньше этого не делал. –
из документов: https://facebook.github.io/react/docs/component-api.html#forceupdate. 'this.forceUpdate()' внутри компонента будет делать трюк. Попробуйте установить таймаут в NavigationCardStack, чтобы проверить его. – sparkFinder