【问题标题】:Reactjs : how to reset the value of a component from parent using hooksReactjs:如何使用钩子从父级重置组件的值
【发布时间】:2019-10-17 17:18:45
【问题描述】:

我有一个组件使用另一个组件从文本框中输入和输出值。我可以获取从子组件输入的值,我的问题是重置子组件的值。现在,一旦我执行了 onadditem 函数,在我单击 onadditem 的添加按钮之前,自动完成输入框仍将保持该值。

这是父组件:

const [state, setState] = useState({
  id: props.spendItem.id,
  isNew: (props.spendItem.id == -1), 
  description: '', 
  vendor: ''
});

const onAddItem = (e) => {
  setState({...state, id: -1, description: '', isNew: true, vendor:''});
}

const setAutoCompleteValue = (e) => {
  setState({...state, vendor: e})
}

var newItem = (<div>
  <AutoComplete 
    items={vendors} 
    name='vendor' 
    value={state.vendor} 
    setValue={setAutoCompleteValue}
  />
  <button onClick={onAddItem}>+</button>
</div>);

这是输入组件

const AutoComplete = props => {
  const [typedValue, setTypedValue] = useState(props.value.name || '');

  useEffect(() => {
    props.setValue(getValue());
  }, [typedValue]);

  const onChange = (e) => {
  // i process my change for the value here
  }

  const getValue = () => {
    return typedValue;
  }

  return (
    <div>
      <input 
        id='auto_input' 
        name='name' 
        onChange={onChange} 
        value={typedValue}
      />
    </div>
  );
}

export default AutoComplete;

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    这是因为您将父组件值传递给子组件,但您只是在子状态一次对其进行初始化,而在下次父组件更改时不会更新子组件。因此,在父级中设置的值将不会继续在子级中反映出来。

    因此您需要决定是将状态存储在父组件中还是在Autocomplete 本身中。我不确定当状态改变时你想要发生什么副作用,但这里有一个基本示例,说明如何将自动完成功能变成一个哑组件,并在添加项目时从父级重置值。我从父级中删除了大部分无关的状态:

    const App = () => {
      const [vendor, setVendor] = React.useState("");
      const [items, setItems] = React.useState([]);
    
      const onAddItem = () => {
        setItems([...items, vendor]);
      }
    
      React.useEffect(() => {
        setVendor("");
      }, [items])
    
      return <div>
                <AutoComplete value={vendor} setValue={setVendor}/>
        <button onClick={onAddItem}>+</button>
        <div style={{ padding: 25}}>
          {items.map(item => <div>{item}</div>)}
        </div>
                </div>
    }
    
    const AutoComplete = ({ value, setValue}) => {
    
    const onChange = (e) => {
      setValue(e.target.value)
    }
    
    const getValue = () => {
      return typedValue;
    }
      return (
        <>
            <input id='auto_input' name='name' onChange={onChange} value={value}/>
        </>
    )
    }
    
    ReactDOM.render(<App/>, document.getElementById("root"))
    

    Codepen here.

    【讨论】:

    • 完美!刚刚开始工作。我很困惑,因为我的自动完成组件上有很多混乱。终于从你所拥有的开始,意识到错误是什么,你是对的,一旦来自父级的值得到更新,来自父级的值就不会更新。我必须从道具中引用“值”,就像你对输入对象所做的那样。解决了整个问题。
    猜你喜欢
    • 1970-01-01
    • 2016-09-07
    • 2020-08-04
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-28
    • 2020-01-22
    相关资源
    最近更新 更多