无法使用 setstate 清除受控输入

Posted

技术标签:

【中文标题】无法使用 setstate 清除受控输入【英文标题】:Unable to clear controlled input with setstate 【发布时间】:2019-11-14 15:13:41 【问题描述】:

当前正在尝试使用 setState 清除受控输入,

向输入字段添加一个值并使用 setState 清除它

清除状态的函数

createNewBoard = (e) => 
  e.preventDefault();
  const newItem =  boardname: this.state.currentValue, todo: [];
  const updatedList = [...this.state.boards, newItem]
  this.setState( 
    boards: updatedList, 
    currentValue: '' 
 );

将 props 传递给组件

render() 
    return(
      <>
         this.state.isBoardOpen ? 
        <ActiveCreateBoard 
          toggleCreateBoard=this.toggleCreateBoard 
          onChange=this.onChange 
          currentValue=this.currentValue
          createNewBoard=this.createNewBoard 
        /> : <CreateBoard toggleCreateBoard=this.toggleCreateBoard/> 

        <ShowAllBoards boards=this.state.boards/>
      </>
    )
  

不更新输入字段的组件本身

const ActiveCreateBoard = ( toggleCreateBoard, onChange, currentValue, createNewBoard ) => 
    return(
        <div className="card">
            <div className="card-body">
                <form onSubmit=createNewBoard>  
                    <h4>Pick a board name</h4>
                    <input 
                    type="text" 
                    onChange=onChange 
                    value=currentValue/>
                </form>
            </div>
            <button onClick=toggleCreateBoard>close</button>
        </div>
    )

this.setState 正在清除 state 中的 currentValue,但输入字段的值并未反映 state 中的更新

【问题讨论】:

请添加来自render() 设置currentValue 的行。 如果您成功地从thisthis.state 中解构createNewBoardonChange,您的代码应该可以正常工作。如果可能,请在此处分享您的整个组件(作为工作副本)。 更新了更多信息,谢谢! 【参考方案1】:

您的输入字段未更新,因为您正在传递this.currentValue,这将是未定义的:

<ActiveCreateBoard 
  toggleCreateBoard=this.toggleCreateBoard 
  onChange=this.onChange 
  currentValue=this.currentValue
  createNewBoard=this.createNewBoard 
/>

相反,您需要从 state 中传递值。

改用this.state.currentValue:

<ActiveCreateBoard 
  toggleCreateBoard=this.toggleCreateBoard 
  onChange=this.onChange 
  currentValue=this.state.currentValue // <---
  createNewBoard=this.createNewBoard 
/>

【讨论】:

没问题。我们都去过那里:)

以上是关于无法使用 setstate 清除受控输入的主要内容,如果未能解决你的问题,请参考以下文章

在 React 中提交表单后无法清除输入字段

使用 setState 提交后清除表单输入

受控组件和不受控组件的区别

react 获取input标签的输入值

React:受控表单上的复选框和文件

浅谈react受控组件与非受控组件