【问题标题】:React Native ios Switch in FlatList not toggling after value changed值更改后,FlatList 中的 React Native ios Switch 不切换
【发布时间】:2019-02-19 01:32:30
【问题描述】:

我正在尝试切换 ios Switch 以响应本机。但是一旦我改变它,开关就会回到初始位置。

我有什么:

class ABC extends Component {
    constructor(props) {
        super(props)
        this.state = {
           obj: []
        }
    }
    fetch(){
    // fetch something from remote server, set it to state object array
    }
    setStatus(id, value){
        var temp = [...this.state.obj]
        temp.map((t) => {
        if (t.id == id) {
            t.flag = value
        }
        })
        this.setState({ obj: temp })
    }
    render() {
        return (
        <View>
            <FlatList
                data={this.state.obj}
                renderItem={({ item }) =>
                    <View>
                        <Text>{item.name}</Text>
                        <Switch
                            onValueChange={(val) => this.setStatus(item.id, val)}
                            value={item.flag}
                        />
                    </View>
                }
                keyExtractor={({ id }, index) => id.toString()}
            />
        </View>
    );
    }
}

我记录了obj 状态的前后值,它们似乎更新了。是否应该再次呈现 FlatList(如网页刷新)?还是我缺少什么?搜索SO 的答案,找不到我的错误。

【问题讨论】:

    标签: react-native react-native-ios uiswitch


    【解决方案1】:

    Flatlist 有一个名为extraData 的道具。

    这个道具告诉Flatlist是否重新渲染。

    如果extraData 中的数据发生变化,则平面列表会根据data 属性中提供的新数据重新呈现。

    因此,当您需要重新渲染平面列表时,只需更改 extraData 中的内容即可。

    最好的方法是将状态传递给extraData,然后再传递给Data

    所以,只需传递extraData={this.state.obj}

    还有其他方式称为forceUpdate

    您可以拨打this.forceUpdate()

    但不建议这样做,因为这不仅会呈现平面列表,还会呈现您调用它的整个组件。

    【讨论】:

    • 有效。除了必须这样做extraData={this.state} 而不是extraData={this.state.obj}。非常感谢!!
    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多