You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React函数组件状态提升报错:无法读取value属性,求实现输入同步

状态提升实现双输入框同步时出现"Cannot read property 'value' of undefined"错误的解决方法

你尝试通过函数组件的状态提升实现两个输入框共享输入值、实时同步,但运行时抛出Uncaught TypeError: Cannot read property 'value' of undefined错误,错误代码如下:

const Nivedhan = () => {            // parent component
const[val,setVal]=useState('')

  function change(e){
   setVal(e.target.value)
  }
 
  return (
       
    <div>
     
      <Nivedhan2 values={change}/>
      <Nivedhan3 values={change}/>
    </div>
  )
}

export default Nivedhan;  


//============================================================================



function Nivedhan2(props){         // child comp 1
  
  function Handle(e){
    props.values(e.target.value)
  }
  
  return(<div>
    <input type='text' onChange={Handle}></input>
  </div>)

}

//=============================================================================
function Nivedhan3(props){        // child comp 2
  
  function Handles(e){
    props.values(e.target.value)
  }
  
  return(<div>
    <input type='text' onChange={Handles}></input>
  </div>)

}

错误原因

父组件的change函数期望接收事件对象e,并从中读取e.target.value;但子组件调用props.values时,直接传递了e.target.value(字符串类型的输入值),此时change函数的参数e变成了字符串,自然不存在target属性,就会抛出"无法读取undefined的value属性"的错误。

另外你的代码还缺少关键逻辑:第二个输入框没有绑定父组件的状态值,即使修复参数问题,也无法实现同步显示。

修复方案

有两种可行的修复方式,选其一即可:

方式一:子组件传递事件对象给父组件

子组件直接把事件对象传给父组件的change函数,让父组件自己读取输入值,同时给两个输入框绑定父组件的val状态值实现同步:

import { useState } from 'react';

const Nivedhan = () => {            // parent component
  const[val, setVal] = useState('')

  function change(e){
    setVal(e.target.value)
  }
 
  return (
    <div>
      <Nivedhan2 values={change} val={val}/>
      <Nivedhan3 values={change} val={val}/>
    </div>
  )
}

export default Nivedhan;  

function Nivedhan2(props){         // child comp 1
  return(<div>
    <input type='text' onChange={props.values} value={props.val}></input>
  </div>)
}

function Nivedhan3(props){        // child comp 2
  return(<div>
    <input type='text' onChange={props.values} value={props.val}></input>
  </div>)
}

方式二:父组件修改函数接收输入值

父组件的change函数改为直接接收输入值,子组件传递e.target.value,同时给输入框绑定状态值:

import { useState } from 'react';

const Nivedhan = () => {            // parent component
  const[val, setVal] = useState('')

  function change(inputVal){
    setVal(inputVal)
  }
 
  return (
    <div>
      <Nivedhan2 values={change} val={val}/>
      <Nivedhan3 values={change} val={val}/>
    </div>
  )
}

export default Nivedhan;  

function Nivedhan2(props){         // child comp 1
  function Handle(e){
    props.values(e.target.value)
  }
  
  return(<div>
    <input type='text' onChange={Handle} value={props.val}></input>
  </div>)
}

function Nivedhan3(props){        // child comp 2
  function Handles(e){
    props.values(e.target.value)
  }
  
  return(<div>
    <input type='text' onChange={Handles} value={props.val}></input>
  </div>)
}

关键说明

  • 给输入框添加value={props.val}绑定父组件状态,才能让两个输入框实时同步显示同一值
  • 保证父组件的回调函数和子组件的传参类型匹配,避免参数不兼容导致的错误

内容的提问来源于stack exchange,提问作者user19467465

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 06:06:16