账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    react更新了数据,但还是上一个值
    57
    0
    问题描述:被点击选中的列,选中状态未发生改变。当点击行后,显示的状态还是上一个状态的状态<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>react demo</title> <script src="https://cdn.bootcdn.net/ajax/libs/react/17.0.1/umd/react.development.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/react-dom/17.0.1/umd/react-dom.development.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/babel-core/5.8.23/browser.min.js"></script> <script src="https://cdn.bootcdn.net/ajax/libs/antd/4.12.3/antd.min.js"></script> <link href="https://cdn.bootcdn.net/ajax/libs/antd/4.12.3/antd.css" rel="stylesheet"></head><body><div id="app"></div><script type="text/babel"> const { useState, useEffect } = React; let dataOneDay = [ { title:'标签1', key:'label1', // 接口调用使用 value:0, }, { title:'标签2', key:'label2', // 接口调用使用 value:0, } ] // 第三层 const StatisticItem = ({ data, onSelect }) => { console.log(data, 'xz154454500'); return ( <div> { data.map(item=>{ return ( <div onClick={()=>{onSelect(item.key)}} key={item.key}> {item.title}的值是:{item.value}。{ item.active ? '被选中' : '未被选中'} </div> )}) } </div> ) } // 第二层 const StatisticBoard = ({ statisticBoardData, activeItemArr, onChange }) => { const [data, setData] = useState(dataOneDay ); useEffect(() => { let newData = data.map(item=>{ return { ...item, value: statisticBoardData[item.key] } }) console.log(newData, 'xz484444'); setData(newData) }, [statisticBoardData]) function activeDataItem(data, activeItemArr){ // 所以重置 data.forEach(item=>{ item.active=false; }) data.forEach(item=>{ if (activeItemArr.includes(item.key)){ item.active=true; } }) return data; } // 高亮 useEffect(() => { console.log(activeItemArr, 'xz200000'); console.log(activeDataItem(data, activeItemArr), 'xz45454119999'); setData(activeDataItem(data, activeItemArr)) }, [activeItemArr]); useEffect(()=>{ console.log(data, 'xz200001'); },[data]) function changeActiveItemArr(arr, key) { let arrCopy=JSON.parse(JSON.stringify(arr)) const index = arrCopy.indexOf(key); if (index>-1){ // 存在,删除 arrCopy.splice(index,1) }else{ arrCopy.push(key) } return arrCopy; } const onSelect = (key) => { onChange(changeActiveItemArr(activeItemArr, key)) } return ( <StatisticItem data={data} onSelect={onSelect}/> ) } // 最外层父组件: 从服务器获取数据,并传递给其他子项 const App = ()=>{ const [activeItemArr, setActiveItemArr] = useState(['label1'] ); return ( <StatisticBoard statisticBoardData={{ label1:100, label2:200 }} activeItemArr={activeItemArr} onChange={(value)=>{ console.log(value, 'xz1128998'); setActiveItemArr(value) }}/> ) } const Box = ({ activeArr, onChange }) => { useEffect(()=>{ console.log(activeArr, 'xz45544554'); },[activeArr]) function changeActiveItemArr(arr, key) { // 深拷贝arr let arrCopy=[...arr] const index = arrCopy.indexOf(key); if (index>-1){ // 存在,删除 arrCopy.splice(index,1) }else{ arrCopy.push(key) } console.log(arrCopy, 'xz222'); return arrCopy; } return ( <div> <div> <button onClick={()=>{ onChange(changeActiveItemArr(activeArr, 'b')); }}>添加一个</button> </div> { activeArr.map(item=>{ return <div key={item}> {item}</div> }) } </div> ); }; ReactDOM.render( <App />, document.getElementById('app') );</script></body></html>
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部