2016-12-19 6 views
1

Redux/Reactネイティブアプリケーションのコンポーネントを返すステートレス関数があります。Redux状態の更新は、コンポーネントのステートレス関数内のメソッドに渡されません。

export default function TasksList (props) { 
    let ds = new ListView.DataSource({ 
    rowHasChanged: (r1, r2) => r1 !== r2 
    }); 

    const _onLongPress = (rowData) => { 
    props.changeCurrentlyEditedTask(rowData.index, rowData) 

    props.navigator.push({ 
     component: EditTask, 
     title: props.selectedTaskText, 
     leftButtonTitle: 'Cancel', 
     rightButtonTitle: 'Save', 
     onLeftButtonPress:() => _cancelEditingTask(), 
     onRightButtonPress:() => _saveEditedTask() 
    }) 
    } 

    const _cancelEditingTask =() => { 
    props.navigator.pop(); 
    props.resetSelectedTask(); 
    } 

    const _saveEditedTask =() => { 
    props.saveEditedTask() 
    props.navigator.pop(); 
    } 

    const dataSource = ds.cloneWithRows(props.listOfTasks); 

    return (
    <View style={ styles.tasksListContainer }> 
     <TextInput 
     autoCorrect={ false } 
     onChangeText={ (text) => props.onChangeText(text) } 
     onSubmitEditing={() => props.addTask(props.text) } 
     returnKeyType={ 'done' } 
     style={ styles.tasksListTextInput } 
     value={ props.text } /> 
     <ListView 
     automaticallyAdjustContentInsets={ false } 
     dataSource={ dataSource } 
     enableEmptySections={ true } 
     renderRow={ (rowData, secctionID, rowID) => { 
      return (
      <TasksListCell 
       completed={ rowData.completed } 
       id={ rowID } 
       onLongPress={ (rowID) => _onLongPress(rowData) } 
       onPress={ (rowID) => props.changeCompletionStatus(rowData.index) } 
       text={ rowData.text } 
       completed={ rowData.completed } 
       formattedDate={ rowData.hasOwnProperty('formattedDate') ? rowData.formattedDate : undefined } /> 
     ) 
     } 
     } 
     style={ styles.tasksListView } /> 
    </View> 
); 
}; 

私のRedux状態が変更されると、その変更は意図したとおりにTasksListに広がります。ただし、_saveEditedTaskはこれらの更新を受信できません。

propsをコンテナ内のsaveEditedTaskディスパッチメソッドの引数として渡そうとすると、親のTasksList関数が行う更新された状態は受信されません。

_saveEditedTaskが親のTasksList機能から最新のpropsを受信するようにこのコードを修正するにはどうすればよいですか?

+0

さらに多くのコンポーネントをReduxに接続することは価値があります。 – Scimonster

+0

プッシュとポップは突然変異関数なので、 'props.navigator.push()'と 'props.navigator.pop()'を使ってあなたの小道具を突然変異させています。これは、リアクションコードの巨大な赤旗です。 –

+0

@Scimonsterこの時点で、EditTaskはコンテナ経由でReduxに接続されています。他のカスタムコンポーネントであるTasksListCellはまだ接続されていません。それを接続することは正しい道を私を送るでしょうか? –

答えて

0

現時点で_saveEditedTask関数が定義されており、実際にはTasksListコンポーネントの小道具にアクセスできます。

問題は、この関数をrenderメソッドの子オブジェクトの小道具として渡していないことです。

あなたのコンポーネントのレンダリングメソッドの子の1つに以下の小道具を付ける必要があります。これをしないと、関数は決して呼び出されません。

onSave={() => _saveEditedTask() } 
関連する問題