我正在重构以使用钩子,我遇到了一个非常令人困惑的问题

我有这样一个基本的功能组件:

export const MakeComponent = props => {
  const { path, value, info, update } = props;

  const [val, setVal] = useState(value);
  console.log(value, val); // abc undefined

 return (...)
}

日志(log)返回abc undefined,即props 中的value是明确定义的,但从useState(value)返回的第一个参数是undefined

为了测试钩子是否有效,我试了useState("abc")次,结果是abc次.

我不知道我做错了什么——有什么 idea 吗?

react 版本:16.8.6

"编辑这里"是父组件——就我所见,这里没有什么奇怪的事情!

<MakeComponent
  path={key}
  value={item[key]}
  info={value}
  update={updateDiffs}
/>

推荐答案

正如 comments 中所提到的,useState(initialState)(或者你管它叫什么)只会在第一次渲染时使用initialState.

initial呈现期间,返回的状态(state)与作为第一个参数(initialState)传递的值相同.

(React Docs,强调我的)

在此之后,在重新呈现时,useState函数不会根据传入的props 的新更改来更改状态.

要使每次value个更改都反映出更改,请在输入props 上注册一个效果,如下所示

export const MakeComponent = props => {
  const { path, value, info, update } = props;

  const [val, setVal] = useState(value);
  useEffect(() => { setVal(value)}, [value] )

 return (...)
}

Reactjs相关问答推荐

无法覆盖MUI工具栏上的左右填充,除非使用!重要

URL参数和React路由中的点

REACT路由DOM根据参数呈现不同的路由

MUiv5和TSS-Reaction SSR问题:无法可靠地处理样式定义.CSSprops 中的ArrowFunctionExpression

为什么在页面重新加载时Location.State变得未定义?

使用 React + Vite 范围化 CSS

如何测试根据 prop 更改 CSS 属性的 useEffect 钩子?

React-router动态路径

如何在 React 中停止嵌套 Link 和 Button 组件的事件传播?

每次状态更改时都会提交react 表单

计数器递增 2 而不是 1

图像路径很奇怪,部署 Next.js 应用程序后我看不到任何图像

在 React JS 中编辑表格数据

react - 警告:列表中的每个子元素都应该有一个独特的 keys props ,即使我已经设置了 keys

如何在react 中更新子组件中的变量?

Storybook - 无法解析generated-stories-entry.cjs/字段browser不包含有效的别名配置

用 scss 覆盖 MUI

从输入中获取数字时,react 计数器不会增加

React如何在用户登录后等待当前用户数据被获取

如何防止 mui x-date-picker 被截断?