
const [selectProductKey, setSelectProductKey] = useState([]);
// 搜索框 key 匹配数组 productKey const matchProductKey = key => { let temporaryArr = [...productKeyArr]; temporaryArr.filter(obj => obj.slice(key) !== -1); setSelectProductKey(temporaryArr); };
OnSearch={e => {matchProductKey(e);}}
// 这里的 selectProductKey 数组确实被筛选了 {selectProductKey.map(key => (<Select.Option value={key}>{key}</Select.Option>))}
1 liujunhn 2022-05-25 09:24:09 +08:00 via iPhone 你不是已经用 setSelectProductKey(temporaryArr)把 filter 之后的数组给到 select Product Key 了吗? |
2 particlec OP // 这里 使用了 filter ,按道理 temporaryArr 不会被改变 temporaryArr.filter(obj => obj.slice(key) !== -1); // selectProductKey 按道理也不会改变啊 setSelectProductKey(temporaryArr); |
3 particlec OP const [selectProductKy, setSelectProductKey] = useState([]); // 这是一个搜索框的功能,通过 key 模糊筛选 const matchProductKey = key => { let temporaryArr = [...productKeyArr]; // 这里 使用了 filter ,按道理原数组 temporaryArr 不会被改变 temporaryArr.filter(obj => obj.slice(key) !== -1); // 如果原数组没有改变 selectProductKey 也不会改变 setSelectProductKey(temporaryArr); }; matchProductKey(e); // 但是实际界面 这里 selectProductKey 确实数据过滤了 {selectProductKey.map(key => ( <Select.Option value={key}>{key}</Select.Option> ))} 重新描述一下,第一次发帖问题顺序有点乱 |
4 shabbyin 2022-05-25 09:36:07 +08:00 原数组没改变 你用 setSelectProductKey 方法把过滤后的新数组通过设置为新的 state 指向了 此时你访问的 state 已经是新数组了 老数组你没有保存其堆地址的话 就再也访问不到了 |
5 particlec OP setSelectProductKey(temporaryArr) state 不是会指向 temporaryArr 吗?为啥会指向新数组呢 |
6 wu67 2022-05-25 09:41:32 +08:00 array 的高级方法不改变原值, 意思是: 直接改基础类型 无效. 直接改引用 无效. 但是如果你改引用类型里面的 下标 /属性 值, 有效. |
7 rabbbit 2022-05-25 09:47:18 +08:00 let temporaryArr = [...productKeyArr]; 这里创建了新数组 temporaryArr setSelectProductKey(temporaryArr); 这里新数组被赋值给 selectProductKey |
8 shabbyin 2022-05-25 09:47:44 +08:00 @particlec 这块有一个比较可疑的点 filter 遍历的元素应该不是一个基础类型数据,而是引用类型的数据 另外 你这个数组结构我属实有点没看懂 filter 里用了 obj.slice 方法,是不是可以认为 obj 是一个数组 那么按道理说你这个 selectProductKey 应该是一个二维数组吧 那么这种情况下怎么做到一层 map 实现 dom 渲染的 |
9 particlec OP console.log(temporaryArr); temporaryArr =['a1k8ySyJMPn', 'a1mXxl1AJOa', 'a1T2vgkO3L7', 'a1xaURWP4fN', 'a1oCgqebiVr', 'a1OSLcORuwH', 'a1StepeOwMD', 'a1oAnKZ7Clp', 'a1M4rSzH9wr', 'a1Y2RSRhB8b'] |
11 rabbbit 2022-05-25 09:53:31 +08:00 建议找个 codepen 之类的贴下代码 |
12 particlec OP 嗯,slice 确实要改成 includes ,主要是那个引用问题还不是很理解 |
13 fengfuliu 2022-05-25 10:00:40 +08:00 @particlec 问题就是你调用了 slice 导致的 slice 返回被裁减过的数组 因为是浅拷贝 影响到了 temporaryArr 吧 |
14 sweetcola 2022-05-25 10:01:23 +08:00 slice 返回的是数组,数组 !== -1 那不是全部 true 吗... |
15 particlec OP 我打印了一下,发现原数组 temporaryArr 确实没有改变,就是 setSelectProductKey(temporaryArr);为啥没指向原数组 |
16 sweetcola 2022-05-25 10:06:24 +08:00 @particlec 你用了 Spread 语法([...productKeyArr]),temporaryArr 就已经是一个新的数组了,不会指向原数组。 |
17 particlec &nbp; OP 不是 slice 的问题,换成 includes 也会出现同样的问题,应该跟 setSelectProductKey 有关 |
18 particlec OP @shabbyin “老数组你没有保存其堆地址的话 就再也访问不到了” 请教 老数组为啥访问不到,setSelectProductKey 为什么会指向新数组呢 |
19 disk 2022-05-25 11:45:11 +08:00 代码不全,看不出更多东西,建议自己跑个 debug 看下 |
20 nazalewoyuanyi 2022-05-25 14:13:55 +08:00 主题支持 Markdown 格式的,建议代码别直接贴,看不清楚... |
21 stillsilly 2022-05-25 17:11:43 +08:00 |
22 stillsilly 2022-05-25 17:16:35 +08:00 |
23 stillsilly 2022-05-25 17:24:40 +08:00 temporaryArr.filter(obj => obj.slice(key) !== -1) 这一句没有改原数组,slice 没有副作用 如果你的数组变了,应该是其它地方改的 |
24 robinlovemaggie 2022-05-25 22:50:49 +08:00 分明是你在某处改了 productKeyArr ,却把锅甩给 filter ,非要给你看下 filter 的源码实现你才相信吗? https://imgur.com/5S9lZ8c |
25 ciaoly 2022-05-25 23:58:54 +08:00 via Android @stillsilly 这个图里的测试代码是不是少打了一个等号? |
26 particlec OP 全部相关的代码已经在三楼了,selectProductKey 的值只在三楼 setSelectProductKey 处改变过,,temporaryArr 就是一个 string[]结构,我已经打印了 temporaryArr 原数组没有改变 |
27 stillsilly 2022-05-26 09:49:01 +08:00 |