【问题标题】:Textarea issue in reactJS : A component is changing a controlled input of type undefined to be uncontrolledreactJS中的Textarea问题:组件正在将未定义类型的受控输入更改为不受控制
【发布时间】:2020-09-15 18:24:00
【问题描述】:

我的代码如下 -

Home.js

import React from 'react'
import AddNewTask from './../components/addNewTask'

class Home extends React.Component{
    constructor(props){
        super(props)
        this.state = {
            addNewTask:{
                title:'',
                discription:'',
                deadline:new Date()
            },
        }

        this.handleNewTaskChange = this.handleNewTaskChange.bind(this)

    }

    handleNewTaskChange(event){
        //console.log(typeof(event))
        var evName,evValue;
        if(event.target){
        const{name,value} = event.target
        console.log(name,value)
        evName = name
        evValue = value
        }
        else{
            evName = "deadline"
            evValue = event
        }
        //console.log(evName,evValue)
        this.setState({
            addNewTask:{
                [evName]:evValue
            }
        })

    }
    render(){
         return(
             <div>
                        <AddNewTask 
                        newTask = {this.state.addNewTask}
                        handleChange = {this.handleNewTaskChange}
                        />
            </div>
        )
    }
}

addNewTask.js

import React from 'react';
import DatePicker from 'react-datepicker';
import 'react-datepicker/dist/react-datepicker.css';

function AddNewTask(props) {
  return (
    <div>
      <form>
        <label>Task : </label>
        <input
          name='title'
          placeholder='Enter Task'
          value={props.newTask.title}
          onChange={props.handleChange}
        />
        <br />
        <label>Discription : </label>
        <textarea
          name='discription'
          placeholder='Enter Task Discription'
          value={props.newTask.discription}
          onChange={props.handleChange}
        />{' '}
        <br />
        <label>Deadline : </label>
        <DatePicker
          name='deadline'
          selected={props.newTask.deadline}
          onChange={(date) => props.handleChange(date)}
          minDate={new Date()}
        />
      </form>
    </div>
  );
}

export default AddNewTask;

我收到了这个错误 -

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

另外,我还没有添加提交功能。

【问题讨论】:

  • 当你有一个对象的状态字段像 : addNewTask: {"title'': "super", discription: "cool"} 如果你想改变一个字段的值,避免使用这个: this.setState(addNewTask: {"title": "blabla"} 因为它会删除另一个字段并且对象 addNewTask 的新值将是 addNewTask: {"title": "blablabla"}。你应该使用下面由@ehab 显示语法。

标签: javascript reactjs react-devtools


【解决方案1】:

问题在这里发生

<textarea   name="discription"
                                placeholder = "Enter Task Discription"
    // this value at first was '' and later became undefined which is what caused the warning
                                value = {props.newTask.discription}
                                onChange = {props.handleChange}
                    />

问题是由,因为当你设置状态描述变得未定义

 handleNewTaskChange(event){
        //console.log(typeof(event))
        var evName,evValue;
        if(event.target){
        const{name,value} = event.target
        console.log(name,value)
        evName = name
        evValue = value
        }
        else{
            evName = "deadline"
            evValue = event
        }
        //console.log(evName,evValue)
        this.setState({
            addNewTask:{
                [evName]:evValue
            }
        })

    }

这应该是

handleNewTaskChange(event){
        const description = event.target.value;

        this.setState(prvState => ({
            addNewTask:{
                ...prvState.addNewTask,
                description
            }
        }))

    }

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 2018-04-11
  • 2018-11-30
相关资源
最近更新 更多