Реакция Native IOS Switch в FlatList не переключается после изменения значения - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь переключить ios Переключить реагировать родной.Но переключатель возвращается в исходное положение, как только я меняю его.

Что у меня есть:

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 ответов, не смог найти мою ошибку.

1 Ответ

0 голосов
/ 19 февраля 2019

Flatlist имеет реквизит, называемый extraData.

Этот реквизит сообщает Flatlist, следует ли повторно выполнить рендеринг или нет.

Если данные в extraData изменяются, то повторный рендеринг flatlist выполняется на основе новых данных, предоставленных в data prop.

Поэтому, когда вам нужно перерисовать плоский список, просто измените что-то в extraData.

Лучший способ - передать состояние в extraData, которое передается в Data.

Итак, просто передайте extraData={this.state.obj}.

там также есть другой способ, называемый forceUpdate.

, вы можете позвонить this.forceUpdate().

, но это не такрекомендуется, потому что это отрендерит не только Flatlist, но и весь компонент, в котором вы вызываете это.

...