【问题标题】:react-native - How to use FlatList to create multiple switches?react-native - 如何使用 FlatList 创建多个开关?
【发布时间】:2026-02-18 00:20:03
【问题描述】:

我希望有一个包含多个开关的列表,本质上是为用户创建一个活动列表,然后如果他们对一个或多个感兴趣,可以“选择/检查”。

我的计划是使用开关作为平面列表的渲染项,但我在两件事上遇到了麻烦。

1) 当它在平面列表中时,我无法让开关保持打开状态。我曾经让它工作过,但从那以后就搞砸了。

2) 当它工作时,所有的开关都会一起切换。

任何帮助将不胜感激!

import React, { Component } from 'react';
import { FlatList, StyleSheet, Text, View, Switch } from 'react-native';

class InterestsList extends Component {
  constructor() {
    listKeys = [
      {key: 'Basketball'},
      {key: 'Football'},
      {key: 'Baseball'},
      {key: 'Soccer'},
      {key: 'Running'},
      {key: 'Cross Training'},
      {key: 'Gym Workout'},
      {key: 'Swimming'},
    ];

    super();
    this.state = {
       switchValue: false
    }
  }

  toggleSwitch = (value) => {
    this.setState({switchValue: value})
    console.log('Switch is: ' + value)
  }

  listItem = ({item}) => (
    <View style={{flex: 1, flexDirection: 'row', justifyContent: 'space-between'}}>
      <Text style={styles.item}>{item.key}</Text>
      <Switch
        onValueChange={(value) => this.setState({switchValue: value})}
        value={this.state.switchValue}
      />
    </View>
  );

  render() {
    return (
      <FlatList
        data={listKeys}
        renderItem={this.listItem}
      />
    );
  }
}

const styles = StyleSheet.create({
  container: {
   flex: 1,
   paddingTop: 22
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
})

export default InterestsList;

【问题讨论】:

  • 尝试明智地改变开关项的状态

标签: javascript react-native react-native-flatlist


【解决方案1】:

你可以试试这个:

import React, { Component } from 'react';
import { FlatList, StyleSheet, Text, View, Switch } from 'react-native';


class InterestsList extends Component {
  constructor() {
    super();
    this.state = {
       listKeys: [
      {key: 'Basketball', switch : false},
      {key: 'Football', switch : false},
      {key: 'Baseball', switch : false},
      {key: 'Soccer', switch : false},
      {key: 'Running', switch : false},
      {key: 'Cross Training', switch : false},
      {key: 'Gym Workout', switch : false},
      {key: 'Swimming', switch : false},
    ]
    }
  }

  setSwitchValue = (val, ind) => {
      const tempData = _.cloneDeep(this.state.listKeys);
      tempData[ind].switch = val;
      this.setState({ listKeys: tempData });
  }

  listItem = ({item, index}) => (
    <View style={{flex: 1, flexDirection: 'row', justifyContent: 'space-between'}}>
      <Text style={styles.item}>{item.key}</Text>
      <Switch
        onValueChange={(value) => this.setSwitchValue(value, index)}
        value={item.switch}
      />
    </View>
  );

  render() {
    return (
      <FlatList
        data={this.state.listKeys}
        renderItem={this.listItem}
      />
    );
  }
}

const styles = StyleSheet.create({
  container: {
   flex: 1,
   paddingTop: 22
  },
  item: {
    padding: 10,
    fontSize: 18,
    height: 44,
  },
})

export default InterestsList;

【讨论】:

  • 这成功了!非常感谢!我唯一不同的是使用 JSON.parse(JSON.stringify(this.state.listKeys)) 而不是 _.closeDeep(this.state.listKeys) 因为我目前没有任何其他需要 lodash.. . 除非这样做有什么问题,或者如果使用 lodash 有我遗漏的其他优势
最近更新 更多