使用 react/redux/react-native-router-flex 在另一个场景中更改状态后刷新概览场景

申格尔迪

github 中提供的最简化的工作示例!!!

我有一个简单的应用程序来学习使用 react native 和 redux 构建应用程序。根据我的理解,如果您在渲染方法中显示来自 redux 状态的数据,然后更改此状态的值,那么该值也将更改,并且由于状态更改而需要重新渲染所有组件。

我在 github 上有可用的应用程序:https : //github.com/schingeldi/checklist

它真的很简单。我有一个概述,如果您单击条目的状态,您将进入详细页面。如果您单击“标记 xxx”,则 redux 状态中的状态已更改(根据日志),但未在概览场景中刷新。

基本上我有一个Overview.js:

class Overview extends Component {

    constructor(props) {
        super(props);
        this.state = {fetching:false};
    }

    entries() {
        // console.log("Overview");
        // console.log(this.props);
        // console.log(this.props.entries);


        return Object.keys(this.props.entries).map(key => this.props.entries[key]);
    }

    componentDidMount() {
        this.setState({fetching:true});
        this.props.actions.getEntries()
            .then( (res) => {
                this.setState({fetching: false});
            })
    }

    handleChange(entryId) {
        Actions.detail({id: entryId});
    }


    render() {

        return (
        <View>
            <ScrollView>
                { !this.state.fetching &&  this.entries().map((entry) => {

                    return (
                        <TouchableHighlight key={entry.id}>
                        <View  >
                            <Text>{entry.name}</Text>
                            <TouchableHighlight onPress={(entryId ) => this.handleChange(entry.id)}><Text>{entry.status}</Text></TouchableHighlight>
                            <Text>---------------------------</Text>

                        </View>
                        </TouchableHighlight>
                    )
                    }

                    )
                }
                {this.state.fetching ? <Text>Searching </Text> : null }
            </ScrollView>


        </View>
    )}
}

function mapStateToProps(state) {

    return {entries: state.default.entries };
}

function mapDispatchToProps(dispatch) {
    return {actions: bindActionCreators(actions,dispatch)};
}

export default connect(mapStateToProps, mapDispatchToProps)(Overview);

单击状态 ( {entry.status} ) 时,我打开另一个 Scene Details.js:

class Detail extends Component {

    constructor(props) {
        super(props);
        this.state = {}
    }

    componentWillMount() {
        this.setState({
            entry: this.props.entries[this.props.id]
        })
    }

    patchEntry(newStatus) {
        console.log("Details: patchEntry with " + this.props.id +" and " + newStatus );
        this.props.actions.patchEntry(this.props.id, newStatus);
    }

    render() {
        return (
            <View>
                <Text>{this.state.entry.name}</Text>

                <TouchableHighlight onPress={() => this.patchEntry('done')}><Text>Mark done</Text></TouchableHighlight>
                <TouchableHighlight onPress={() => this.patchEntry('cancelled')}><Text>Mark cancelled</Text></TouchableHighlight>
            </View>
        )
    }
}



function mapStateToProps(state) {
    console.log(state);
    return {entries: state.default.entries };
}


function mapDispatchToProps(dispatch) {
    return {actions: bindActionCreators(actions,dispatch)};
}

export default connect( mapStateToProps, mapDispatchToProps)(Detail);

我有一个动作和一个减速器,当按下其中一个 TouchableHighlights 时,它们被完美地调用。我什至在日志中看到输出整个状态时状态发生了变化。

但我的问题是,一旦我从 Detail 场景返回(弹出),我如何在 Overview 场景中刷新状态?

如果您需要更多信息,请告诉我,但在我编写了一个完整的工作应用程序时,它应该很容易重现。只需克隆,npm install 并运行它。

非常感谢你的帮助。

安德烈·杨

我快速查看了您的代码,这里有一些建议/信息。

在您的Detail.js文件中,一旦安装了组件,您就会设置您的状态。当您更新您的 redux 存储并获得刷新的道具时,它不会更新您的 UI,因为它反映了您的状态,并且您的状态不会获得新值,因为您只是在componentWillMount方法上设置它在文档中查看更多信息

此外,您似乎不太清楚何时使用 React 组件的状态。在这个例子中,从Detail.js文件中你根本不需要组件的状态。您可以直接从属性计算该值。

前任:

render() {
  const entry = this.props.entries[this.props.id];
  return (
    <View>
      <Text>{entry.name}</Text>

      <TouchableHighlight onPress={() => this.patchEntry('done')}><Text>Mark done</Text></TouchableHighlight>
      <TouchableHighlight onPress={() => this.patchEntry('cancelled')}><Text>Mark cancelled</Text></TouchableHighlight>
    </View>
  )
}

你甚至可以在你的mapStateToProps函数中做到这一点更多信息在这里

前任:

function mapStateToProps(state, ownProps) {
  return {
    entries: state.default.entries,
    entry: state.default.entries[ownProps.id],
  };
}

似乎您的Overview.js文件关于正在更新的 UI 没问题,因为它的渲染方法反映的props是状态而不是状态。

更新 06/27

我刚刚检查了你的reducers,你可能也有一些修复要做。

case ENTRY_PATCHING:
  let patchedEntries = state.entries;
  patchedEntries[action.data.entryId].status = action.data.newStatus;

  return {...state,
    entries: patchedEntries
  }

在这个减速器中,你正在改变你的状态,你不能那样做。redux 存储不能被改变。您可以在此处查看有关它的更多详细信息http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html

因此,修复示例:

case ENTRY_PATCHING:
  const patchedEntry = {
    ...state.entries[action.data.entryId],
    status: action.data.newStatus
  }

  return {
    ...state,
    entries: {
      ...state.entries,
      [action.data.entryId]: patchedEntry,
    }
  }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在React-native中使用NavigatiorIOS导航到另一个场景

来自分类Dev

使用React Native Router Flux在所有场景中维护选项卡

来自分类Dev

使用react-native中的flex使项目坚持到底

来自分类Dev

React Native Router Flux:使用相同场景但使用其他参数的转换和历史

来自分类Dev

Flex WebView在React Native中

来自分类Dev

如何使用 react-native-router-flux 设置作为选项卡子项的场景的标题

来自分类Dev

在 React Native Router Flux 中跨主要场景导航

来自分类Dev

异步操作后使用 React Router 在 React Native 中更改路由

来自分类Dev

在SpriteKit中使用另一个场景中的布尔值-Swift

来自分类Dev

React Native Router Flux:从主场景导航到子场景

来自分类Dev

承诺后如何使用react-router重定向到另一个URL?

来自分类Dev

React-Native 中的右下对齐(使用 Flex-box)不起作用

来自分类Dev

如何在 React Native 的另一个组件中使用 API 获取状态

来自分类Dev

如何使用Scenic将消息从一个场景发送到另一个场景?

来自分类Dev

React Native中的Flexbox'flex'属性

来自分类Dev

使用带有redux的react-native-router-flux,如何更新视图组件中的状态?

来自分类Dev

React Native如何在Flex方向行内使用<br>

来自分类Dev

使用flex in react native expo将同一行中的2张卡片与动态内容对齐

来自分类Dev

Flex React Native-当内容到达边缘时如何使用flex中断内容

来自分类Dev

将div放置在另一个div下方[使用display:flex]

来自分类Dev

使用React-Router-Native从React Native中的Axios拦截器(组件外部)重定向到View组件

来自分类Dev

使用Meteor和Iron Router路由到另一个页面后如何重新加载页面

来自分类Dev

React Native-在另一个文件的对象中使用文件中的常量

来自分类Dev

我的按钮无法更改另一个React Native组件中的状态

来自分类Dev

使用Sprite Kit和Swift从另一个场景影响孩子

来自分类Dev

使用加特林将变量从json保存并获取到另一个场景

来自分类Dev

使用flex-column仅滚动一个flexbox项,而另一个保持固定

来自分类Dev

如何在React Native中从另一个功能组件更改一个功能组件的状态?

来自分类Dev

从React Native中的另一个组件导航后,如何刷新堆栈中已经存在的组件

Related 相关文章

  1. 1

    在React-native中使用NavigatiorIOS导航到另一个场景

  2. 2

    使用React Native Router Flux在所有场景中维护选项卡

  3. 3

    使用react-native中的flex使项目坚持到底

  4. 4

    React Native Router Flux:使用相同场景但使用其他参数的转换和历史

  5. 5

    Flex WebView在React Native中

  6. 6

    如何使用 react-native-router-flux 设置作为选项卡子项的场景的标题

  7. 7

    在 React Native Router Flux 中跨主要场景导航

  8. 8

    异步操作后使用 React Router 在 React Native 中更改路由

  9. 9

    在SpriteKit中使用另一个场景中的布尔值-Swift

  10. 10

    React Native Router Flux:从主场景导航到子场景

  11. 11

    承诺后如何使用react-router重定向到另一个URL?

  12. 12

    React-Native 中的右下对齐(使用 Flex-box)不起作用

  13. 13

    如何在 React Native 的另一个组件中使用 API 获取状态

  14. 14

    如何使用Scenic将消息从一个场景发送到另一个场景?

  15. 15

    React Native中的Flexbox'flex'属性

  16. 16

    使用带有redux的react-native-router-flux,如何更新视图组件中的状态?

  17. 17

    React Native如何在Flex方向行内使用<br>

  18. 18

    使用flex in react native expo将同一行中的2张卡片与动态内容对齐

  19. 19

    Flex React Native-当内容到达边缘时如何使用flex中断内容

  20. 20

    将div放置在另一个div下方[使用display:flex]

  21. 21

    使用React-Router-Native从React Native中的Axios拦截器(组件外部)重定向到View组件

  22. 22

    使用Meteor和Iron Router路由到另一个页面后如何重新加载页面

  23. 23

    React Native-在另一个文件的对象中使用文件中的常量

  24. 24

    我的按钮无法更改另一个React Native组件中的状态

  25. 25

    使用Sprite Kit和Swift从另一个场景影响孩子

  26. 26

    使用加特林将变量从json保存并获取到另一个场景

  27. 27

    使用flex-column仅滚动一个flexbox项,而另一个保持固定

  28. 28

    如何在React Native中从另一个功能组件更改一个功能组件的状态?

  29. 29

    从React Native中的另一个组件导航后,如何刷新堆栈中已经存在的组件

热门标签

归档