错误的反应控制组件警告?

Posted

技术标签:

【中文标题】错误的反应控制组件警告?【英文标题】:erroneous react-controlled-components warning? 【发布时间】:2018-05-14 19:28:20 【问题描述】:

此 JSX 代码段正在生成 react-controlled-components 警告:

          <input
            type="text"
            className="form-control endpoint-text"
            placeholder="fred.scuttle"
            value= this.props.internals.username 
            onChange= this.handleUserNameChange.bind(this) 
          />

在控制台中生成此警告:

警告:组件正在更改要控制的文本类型的不受控制的输入。输入元素不应从不受控切换到受控(反之亦然)。决定在组件的生命周期内使用受控输入元素还是不受控输入元素。更多信息:https://reactjs.org/docs/forms.html#controlled-components

这是一个大型的 react/redux 应用程序,有很多很多受控组件,如果您点击上面的链接,我的代码看起来不错。

有人看到我的错误吗?我想不通。加载此表单时,状态值“用户名”可能未定义,但这不是我通常在调用未定义状态数据时得到的警告/错误。

提前致谢!

@Nandu Kalidindi:

  handleUserNameChange = (event) => 
    this.props.emitSetUserName(event.target.value);
  

它只是在 redux 状态下设置/更新用户名字段:

export function emitSetUserName(uname) 
  return 
    type: EMIT_SET_NAME_CHANGE,
    payload: uname
  

该状态变量的初始值是从同一组件中的 cookie 加载的:

 componentWillMount = () => 
   let username = cookies.get('uname');
   if ( username !== undefined ) 
     this.props.emitSetUserName(username);
   
 

这是竞争条件吗?我希望尝试访问和未定义的状态值会出错,而不是“受控输入”警告..​​.

【问题讨论】:

请同时发布您的handleUserNameChange 处理程序。我的猜测是因为父母试图在子组件输入上设置一个值。使用状态变量可能比直接输入 props.internals.username 更好 尝试在您的value= this.props.internals.username 中使用defaultValue 而不是value 我通常在这种情况下使用 defaultValue,但该值不会“显示”为默认值。处理它,闻起来像是一种竞争条件。 【参考方案1】:

这确实是一个竞争条件。我需要处理 cookied 并在父组件中相应地设置状态。 defaultValue 现在也可以正常工作。感谢您的反馈!

【讨论】:

以上是关于错误的反应控制组件警告?的主要内容,如果未能解决你的问题,请参考以下文章

警告:组件正在将文本类型的受控输入更改为不受控制。 (反应.js)

反应错误 - 检查`t`的渲染方法

如何解决反应原生 EventEmitterListener 警告

React-Apollo - 查询 - renderProp:反应警告:无法对未安装的组件执行反应状态更新

反应:警告列表中的每个孩子都应该有一个唯一的键[重复]

[Vue 警告]:无法挂载组件:未定义模板或渲染函数。错误