当前位置: 首页 > 知识库问答 >
问题:

(ReactJS)“警告:组件正在将非受控输入更改为受控。这可能是由于值从未定义更改为…”

黄流觞
2023-03-14

由另一个控制器控制的用户表单在控制台上抱怨“警告:一个组件正在将一个不受控的输入改变为受控的。这可能是由于值从未定义的值更改为已定义的值而导致的,这是不应该发生的。决定在组件的生命周期内使用受控还是不受控的输入元素。更多信息:https://reactjs.org/link/controlled-components输入跨度li ul ... "

这是组件代码:

export default({user}) => {
  if(!user) {
    return <div></div>
  } else {
    const [name,setName] = useState(user.name|| "")
    useEffect(() => {
      setName(user.name);
    }, [user])
              
    return <form>
             <fieldset> 
               <legend> Edit  {user.name }</legend>
               <p> 
                 <label htmlFor={"name"}> Name  </label>
                 <input  id="name" value={name || ""} onChange={e => setName(e.target.value)} />
               </p> 
             </fieldset>
           </form>
  }
}

我尝试了其他stackoverflow答案中建议的所有修复程序,但仍然给出了警告。
我是否错过了什么?

共有3个答案

程成天
2023-03-14

这个问题主要发生在您有一个未定义的属性值时,现在它可以检查for

解决方案:添加具有默认值的||

<input checked={state.bestSellerOnly || false} id="best-seller" type="checkbox" value="" className="" />

这里的< code > state . best selor only 可能会在挂载时返回undefined,这可能会导致对react的警告。

樊胜
2023-03-14

我已使用此工作示例更新了您的组件。

const { useEffect, useState } = React;

function Example({ user }) {

  const [name, setName] = useState(user.name);

  function handleChange(e) {
    setName(e.target.value);
  }

  useEffect(() => console.log(name), [name]);

  if(!user) return <div></div>;

  return (
    <form>
      <fieldset> 
        <legend>Edit name</legend>
        <input
          id="name"
          value={name}
          onChange={handleChange}
        />
      </fieldset>
    </form>
  )
};

const user = { name: 'Bob' };

ReactDOM.render(
  <Example user={user} />,
  document.getElementById('react')
);
html lang-html prettyprint-override"><script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.production.min.js"></script>
<div id="react"></div>
宗政燕七
2023-03-14

实际上,在react中,当你面对这个问题时,这是受控和非受控组件的错误,简单地说:受控组件:是使用状态来改变其值的组件。例子:

<input
onChange={(e)=>{whatever!}
value={from your state}
/>

而在不受控制的组件状态中,不涉及太多,您可以简单地使用默认值或ref。例:

<input
defaultValue={from your state or from anywhere}
/>

请记住:如果您同时使用value和defaultValue,它会给您错误,因为我们不能同时使用受控组件的value和非受控组件的defaultValue。

提示:您需要在受控组件和非受控组件之间进行选择,因此使用ref将是解决方案。或将值更改为默认值将解决它。

注:

defaultValue仅适用于初始加载。如果您想初始化输入,那么您应该使用defaultValue,但如果您想使用state来更改值,那么您需要使用value。阅读本文以了解更多React输入defaultValue不会随状态更新

我在输入中使用了以下方式来摆脱该警告,通过使用短路计算来定义值属性,如下所示:

value={this.state.fields.name || ''}   // (undefined || '') = ''

另一种方法

原因是,在您定义的状态下:

this.state = { fields: {} }

字段作为空白对象,因此在第一次渲染期间 this.state.fields.name未定义,输入字段将获得其值:

value={undefined}

因此,输入字段将变得不受控制。

在输入中输入任何值后,状态中的字段将更改为:

this.state = { fields: {name: 'xyz'} }

并且在那时输入场被转换成受控分量;这就是为什么您会得到这个错误:

组件正在将文本类型的非受控输入更改为受控输入。

可能的解决方案:

1-将状态中的字段定义为:

this.state = { fields: {name: ''} }
 类似资料:
  • 使用ui textfield时出错 警告:TextField正在将text类型的受控输入更改为不受控。输入元素不应从受控切换到非受控(或反之亦然)。决定在组件的生存期内使用受控还是不受控输入元素

  • 我试图摆脱这个错误信息,但仍然没有成功。 还有Facebook页面的链接,但我仍然不知道该如何找到它。 在输入似乎总是一个非空值,我如何解决这个问题?

  • 我一直有这个错误:一个组件正在将受控输入的类型文本更改为不受控制。输入元件不应从受控切换到不受控(反之亦然)。决定在组件的生命周期内使用受控或不受控制的输入元件。当我尝试将值从数据库输入框点击编辑 这是我的代码:

  • 我正在对我的组件进行排序 我在选择标记中有一个错误。获取错误props.filters.sortby的值最初是日期。当我试图从下拉列表中更改它时,错误发生了。

  • 我有一个页面,我从服务器上获取数据,并为受控输入设置状态值。(例如,我有一个值为的输入,我从服务器上获取名称(例如Dave)并将其设置为name,因此输入值为Dave。它可以工作,但我遇到了对象数组的问题。) 所以这就是状态 这就是我如何使用 但这会导致此错误:

  • 问题内容: 警告:组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控制切换为受控制(反之亦然)。确定在组件的使用寿命中使用受控或非受控输入元素。* 以下是我的代码: 问题答案: 原因是,在您定义的状态下: 字段作为空白对象,因此在第一次渲染期间将是,输入字段的值将为: 因此,输入字段将变得不受控制。 在输入中输入任何值后,状态将变为: 那时输入字段被转换为受控组件;这就是为什么您得