【问题标题】:onChange is resetting state - useStateonChange 正在重置状态 - useState
【发布时间】:2021-06-05 01:26:21
【问题描述】:

我对 ReactJs 并不陌生,但不知何故,当我在我的组件函数中 console.log 时,它显示已经设置的属性也被重置了。下面是我完整的功能组件

import React, { useState } from 'react';
import {
  Grid, Typography, Paper, TextField,
} from '@material-ui/core';
import Autocomplete from '@material-ui/lab/Autocomplete';
import SomeComponent from '../../common/SomeComponent';
import countries from '../../utils/countries_data';
import AlertMsg from '../../utils/Alert';
import { MarkRequired } from '../style';

const App = ({ classes, handleNext, handlePay }) => {
  const [contact, setContact] = useState({
    firstName: '',
    lastName: '',
    address1: '',
  });

  const handleChange = (e) => setContact({
    ...contact,
    [e.target.name]: e.target.value,
  });
  console.log('above splitAddressProperties', contact);
  const splitAddressProperties = (data) => {
    console.log('func start', contact);
    const country = countries.filter(
      (count) => count.alpha2 === data.country_code || count.alpha3 === data.country_code,
    );
    setContact({
      ...contact,
      address1: data.address,
      city: data.city,
      zip: data.zip,
      country: country[0],
    });
    console.log('func end', contact);
  };


  return (
    <Grid item xs={12}>
      <Paper className={classes.paper}>
        <Typography className={classes.inputText}>Contact Information</Typography>

        <Grid container style={{ marginBottom: '15px' }}>
          <Grid item xs={6} style={{ paddingRight: '10px' }}>
            <Typography className={classes.inputTitle}>
              First Name
              <MarkRequired>*</MarkRequired>
            </Typography>
            <input
              className={classes.inputsty}
              value={contact.firstName}
              onChange={handleChange}
              type="text"
              name="firstName"
            />
          </Grid>
          <Grid item xs={6} style={{ paddingLeft: '10px' }}>
            <Typography className={classes.inputTitle}>
              Last Name
              <MarkRequired>*</MarkRequired>
            </Typography>
            <input
              className={classes.inputsty}
              value={contact.lastName}
              type="text"
              onChange={handleChange}
              name="lastName"
            />
          </Grid>
        </Grid>
        <Grid style={{ marginBottom: '15px' }}>
          <Typography className={classes.inputTitle}>
            Address
            <MarkRequired>*</MarkRequired>
          </Typography>
          <SomeComponent
            className={classes.inputsty}
            value={contact.address1}
            onChange={splitAddressProperties}
          />
        </Grid>
      
      </Paper>
    </Grid>
  );
};

export default App;

如果我输入名字和姓氏并输入 SomeComponent 值splitAddressProperties 被触发,但它显示联系人的值与默认值相同。需要注意的是 console.log('above splitAddressProperties', contact);输入名字和姓氏时触发两次。

【问题讨论】:

  • console.log('above splitAddressProperties', contact) 显示正确的联系人值?
  • 是的...但在进入func之前

标签: javascript reactjs react-hooks use-state


【解决方案1】:

我没有足够的信息来真正找到问题,但我猜 SomeComponent 存储并使用了 onChange 属性的旧引用。

例如:

const SomeComponent = (props) => {
    // ...
    const innerOnChange = useCallback(
        (data) => {
            props.onChange(data);
        }, 
        // Note that the deps array doesn't have onChange:
        []
    );
    // ...
}

我要做的是从 setState 访问当前联系人:

setContact(currentContact => ({
    ...currentContact,
    address1: data.address,
    city: data.city,
    zip: data.zip,
    country: country[0],
}));

setContact 的引用永远不会改变,它总是会给你当前的联系人对象。 (不过最好修复SomeComponent

【讨论】:

  • 你能解释一下吗?我知道我的代码保留了旧的引用,因为我更改了登录到控制台的消息,并且热刷新在那个 onChange 引用的函数上不起作用。 axios.post(UPLOAD_URL, data, config).then(function (res) { const {data} = res if (props.onFileAdded) props.onFileAdded(props.index, data) }) 传递的 props.onFileAdded 使用 old我的状态变量的值。我该如何解决?
  • 我刚刚发布了这个问题:stackoverflow.com/questions/68211523/…
猜你喜欢
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
相关资源
最近更新 更多