代码之家  ›  专栏  ›  技术社区  ›  Sachidananda MG

.push()没有更新变量

  •  4
  • Sachidananda MG  · 技术社区  · 3 年前

    我试图将使用setData函数设置的数据推送到data[]。我可以推送数据一次,但第二次推送时,它取代了数据[0],而不是存储在数据[1]中。我做错了什么。 提前谢谢你。

    export default function App() {
     const [data,setData]= useState([]);
     const [activity, setActivity]= useState([])
     const [name, setName] = useState("")
    
     const datas=[];
     useEffect(()=>{
      // handlePress()
     }, [setData, setName])
    
     const rand= Math.floor(Math.random(1,5)*4)+1
     const events=["Event A","Event B","Event C","Event D","Event E"]
    
     const handlePress=(day)=>{
       setData(day);
       setName(`${events[rand]}`)
       datas.push(data);
       console.log(datas);
     }
      return (
        <div className="App">
          <Calendar 
            onDayPress={day => {
              {handlePress(day)}
            }}
            
          />
          
        </div>
      );
    }
    
    3 回复  |  直到 3 年前
        1
  •  1
  •   Nick Vu    3 年前

    App 每次改变状态都会被重新渲染 const datas=[]; 将初始化为新数组。

    我能预见的另一个问题是你打电话 setData(day) 然后打电话 datas.push(data) 在同一个函数上,由于状态的更改是异步的,所以不会应用于最新的数据

    const handlePress=(day)=>{
       setData(day); //`day` is set here but not applied immediately
       setName(`${events[rand]}`)
       datas.push(data); //data is the previous data, not `day`
       console.log(datas);
     }
    

    完整的修改可以是

    const datas=[]; //move your `datas` to the global scope
    
    export default function App() {
     const [data,setData]= useState([]);
     const [activity, setActivity]= useState([])
     const [name, setName] = useState("")
    
     
     useEffect(()=>{
      // handlePress()
     }, [setData, setName])
    
     const rand= Math.floor(Math.random(1,5)*4)+1
     const events=["Event A","Event B","Event C","Event D","Event E"]
    
     const handlePress=(day)=>{
       setData(day); //`data` will be changed later
       setName(`${events[rand]}`)
       datas.push(day); //push `day` directly instead of data
       console.log(datas);
     }
      return (
        <div className="App">
          <Calendar 
            onDayPress={day => {
              {handlePress(day)}
            }}
            
          />
          
        </div>
      );
    }
    

    你也不应该使用 useEffect 和二传手( setData setName ).这些二传者与副作用无关。您应该将状态值作为依赖项传递到 使用效果 .

    //whenever `name` or `data` change, `useEffect` will be triggered
    useEffect(()=>{
      //TODO: Do your logic here
     }, [data, name])
    
        2
  •  1
  •   Inder    3 年前

    这个 datas 数组被添加到组件内部。每次组件重新呈现时,它都会重新初始化为空数组。

    还有 onDayPress 在回调函数中添加了一对额外的花括号

        3
  •  1
  •   Poojan3037    3 年前

    在react中,更新状态时,将重新渲染react组件。因此,当您在handlePress()函数中更新状态时,组件将被重新呈现。因此,数据数组被重新初始化并再次变为空。所以每次你推物品时,它都会增加到第一位。希望对你有帮助。