为了账号安全,请及时绑定邮箱和手机立即绑定

卸载屏幕后重置状态 - 挂钩?

卸载屏幕后重置状态 - 挂钩?

青春有我 2022-12-29 15:15:51
从 API 获取数据后,我将其设置为状态,并在 Flatlist 中呈现项目,当我从中选择任何项目时,我会操作数据并向名为“toggle: true”的项目对象添加一个新属性当我从列表中选择任何项目时效果很好,我添加了一个基于的边框toggle,但是当我返回上一个屏幕然后重新打开列表屏幕时,我可以看到在项目周围呈现的边框,尽管我在卸载时重置了状态屏幕那么我在这里犯了什么错误?代码片段数据export default {  ...  services: [    {      id: 0,      name: 'nameS0',      logo:        'https://cdn2.iconfinder.com/data/icons/hotel-98/64/hair-dryer-tools-beauty-hairdressing-512.png',      price: 19.99,    },    ],  employees: [    {      id: 0,      name: 'name0',      img:        'https://www.visualelementmedia.com/wp-content/uploads/2015/04/person-4-400x629.jpg',    },    ...  ],};const VendorProfile = ({navigation}) => {  const [services, setServices] = React.useState(null);  const [employees, setEmployees] = React.useState(null);  const [serviceSelected, setServiceSelected] = React.useState(null);  const [employeeSelected, setEmployeeSelected] = React.useState(null);    // For selected Item (services, employees)  const itemSelected = (data, id) => {    const updated = data.map((item) => {      item.toggle = false;      if (item.id === id) {        item.toggle = true;        data === services          ? setServiceSelected(item)          : setEmployeeSelected(item);      }      return item;    });    data === services ? setServices(updated) : setEmployees(updated);  };  ...  const renderEmployees = ({item}) => {    return (      <TouchableOpacity        onPress={() => itemSelected(employees, item.id)}        delayPressIn={0}        style={styles.employeeContainer}>        <EmployeePattern style={{alignSelf: 'center'}} />        <View style={styles.employeeLogo}>          <Image            source={{uri: item.img}}            style={[styles.imgStyle, {borderRadius: 25}]}          />    );  };
查看完整描述

1 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

好吧,在尝试了多次之后,我明白了

改变这个

 const updated = data.map((item) => {

对此

 const updated = data.map((old) => {
       let item = {...old};

请确保一切正常,我们没有破坏任何东西 :)

在您的 ItemSelected 函数上,您传递了整个员工列表,现在可以通过它了,但是当您更改此列表中的一个项目而不“重新创建它”时,对该项目的引用仍然是相同的“因为它是一个对象”的意思我们正在修改原始项目,并且由于我们这样做,项目保留了它的旧引用,避免这种情况的最佳方法是重新创建对象,希望这能给你一个想法。


查看完整回答
反对 回复 2022-12-29
  • 1 回答
  • 0 关注
  • 59 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信