【发布时间】:2021-11-19 02:31:40
【问题描述】:
此代码似乎有效。没有人这样做。它到底有什么问题?什么情况下会产生bug?
function App(){
const [b1, n1] = button()
const [b2, n2] = button()
const [input1, text] = input()
return <div>
<div>Total: {n1}+{n2}={n1+n2}. That's {text}.</div>
<div>{b1} {b2} {input1}</div>
</div>;
}
function button() {
const [n, setN] = React.useState(0)
const b = <button onClick={()=>setN(n=>n+1)}>Increment</button>
return [b, n]
}
function input() {
const [t, setT] = React.useState("okay")
const i = <input type="text" value={t} onChange={e=>setT(e.target.value)}/>
return [i, t]
}
https://jscomplete.com/playground/s752284
很整洁,如果可以的话我想用一下。
编辑澄清:假设您需要将状态从子组件提升到父组件。有很多方法。向下传递ref,向下传递setState,向下传递dispatch,等等。这种方法不需要任何向下传递,只需向上传递。由于某种原因,自定义钩子通常不会返回 JSX。这种模式有什么隐藏的问题吗?
编辑 2:扩展示例
【问题讨论】:
-
相关:stackoverflow.com/questions/62186513/…。区别在于你返回的是哪种 JSX。
-
澄清上述观点:基本上要注意返回反应元素(jsx)之间的区别,这很好,返回反应组件,不是。在 OP 提供的示例中,他们正在返回一个元素,这是可以接受的。
-
谢谢。我的理解是,您基本上永远不想在任何组件或效果的主体中定义组件(即返回 JSX 的函数)。