私はreduxと不変のjsを使って反応するネイティブアプリを持っています。私のメイン画面からアクションをディスパッチすると、自分のアクション、レデューサー、そしてコンテナに戻りますが、ビューは更新されず、componentWillReceievePropsは呼び出されません。また、メイン画面は、項目がサブコンポーネントであるリストの項目である。あなたがもっと知りたいのであれば、問題の関連コードはここにあります。reduxでの小道具変更にサブコンポーネントを再レンダリングするにはどうすればいいですか?
データを持つ行をレンダリング:
renderRow(rowData) {
return (
<Item item={ rowData } likePostEvent={this.props.likePostEvent} user={ this.props.user } removable={ this.props.connected } />
)
}
アクションをディスパッチし、その結果を示すItem.jsの一部:
<View style={{flex: 1, justifyContent:'center', alignItems: 'center'}}>
<TouchableOpacity onPress={ this.changeStatus.bind(this, "up") }>
<Image source={require('../img/up-arrow.png')} style={s.upDownArrow} />
</TouchableOpacity>
<Text style={[s.cardText,{fontSize:16,padding:2}]}>
{ this.props.item.starCount }
</Text>
<TouchableOpacity onPress={ this.changeStatus.bind(this, "down") }>
<Image source={require('../img/up-arrow.png')} style={[s.upDownArrow,{transform: [{rotate: '180deg'}]}]} />
</TouchableOpacity>
</View>
アクションがディスパッチfirebaseに進み、有し別のアクションをディスパッチするonChangeハンドラ。
減速:
const initialState = Map({
onlineList: [],
offlineList: [],
filteredItems: [],
connectionChecked: false,
user: ''
})
...
...
case ITEM_CHANGED:
list = state.get('onlineList')
if(state.get('onlineList').filter((e) => e.id == action.item.id).length > 0){
let index = state.get('onlineList').findIndex(item => item.id === action.item.id);
list[index] = action.item
list = list.sort((a, b) => b.time_posted - a.time_posted)
}
return state.set('onlineList', list)
.set('offlineList', list)
コンテナ:
this.props.getInitialState({
addItem: this.props.addItem,
removeItem: this.props.removeItem,
goOnline: this.props.goOnline,
goOffline: this.props.goOffline,
itemChanged: this.props.itemChanged
})
:初期状態を取得する呼び出す
export function getInitialState(closure_list) {
itemsRef.on('child_removed', (snapshot) => {
closure_list.removeItem(snapshot.val().id)
})
itemsRef.on('child_added', (snapshot) => {
closure_list.addItem(snapshot.val())
})
itemsRef.on('child_changed', (snapshot) => {
closure_list.itemChanged(snapshot.val())
})
connectedRef.on('value', snap => {
if (snap.val() === true) {
closure_list.goOnline()
} else {
closure_list.goOffline()
}
})
return {
type: GET_INITIAL_STATE,
connected: true
}
}
:私はのonChange接続
function mapStateToProps(state) {
return {
onlineItems: state.items.get('onlineList'),
offlineItems: state.items.get('offlineList'),
filteredItems: state.items.get('filteredItems'),
connectionChecked: state.items.get('connectionChecked'),
connected: state.items.get('connected'),
user: state.login.user
}
}
何か提案がありがとうございます、ありがとうございます!
私は2つのアクションが別々であるため、この問題はわかりません。上向きの矢印を押すと、データベースを変更するアクションが別途に送信されます。ビューを変更する予定の変更アイテムに関数が接続されています。 –
上記の更新されたコードを参照 –