React Input 组件总是落后一步

React Input component it always comes one step behind

我运行遇到了一个小问题,你能帮忙吗?我正在尝试制作一个输入组件,但是当我在输入中输入内容时,它总是落后一步。 这是正确的方法吗?或者有什么方法可以制作输入组件?

这是Input.js

import React, { useState } from 'react';

function Input(props) {
  const [value, setValue] = useState('');
  const { type, className, placeholder } = props;

  let handleChange = (e) => {
    setValue(e.target.value);
    props.onChange(value);
  };

  return (
    <>
      <div className='input-group mb-3'>
        <input
          onChange={handleChange}
          type={type == null ? 'text' : type}
          value={value == null ? '' : value}
          className={className == null ? 'form-control' : className}
          placeholder={placeholder == null ? '' : placeholder}
        />
      </div>
    </>
  );
}

export default Input;

这是App.js

import React, { useState } from 'react';

import Input from './components/Input/Input';
function App(props) {
  const [d, setC] = useState([]);

  function onChangeValue(e) {
    setC(e);
    console.log(e);
  }

  return (
    <>
      <div className='container'>
        <div className='row'>
          <Input onChange={onChangeValue}></Input>
          <span>{d}</span>
        </div>
      </div>
    </>
  );
}

export default App;

因为你通过组件状态设置了props.onChange,只有在下一次渲染时才可用

因为 Reactjs setState is batching 和异步,它会等待 evenHanlder 完成然后更新状态。

如果您希望它立即反映输入的变化,请像这样使用输入本身的值:

let handleChange = (e) => {
  setValue(e.target.value);
  props.onChange(e.target.value);  //<-- Use e.target.vale instead of value
};

工作示例:

您正试图在实际设置之前访问值

 let handleChange = (e) => {
    setValue(e.target.value);
    props.onChange(value);
  };

value setValue 不会立即给变量设置值。它只会在下一次渲染时设置。

你可以这样做

let handleChange = (e) => {
    setValue(e.target.value);
    props.onChange(e.target.value);
  };

或者

(最佳方法)

 let handleChange = (e) => {
        setValue(e.target.value);
      };
 useEffect(()=> {
    props.onChange(value);
 }, [value])

所以在每次值变化时它都会调用你的 props 函数