From 04b83b13961401731b6cf4f7c63ede9d8c15fc76 Mon Sep 17 00:00:00 2001 From: cqh963852 Date: Thu, 15 Feb 2024 06:57:04 +0000 Subject: [PATCH] Keyed Element Signed-off-by: cqh963852 --- src/keyed-element | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/keyed-element diff --git a/src/keyed-element b/src/keyed-element new file mode 100644 index 0000000..edb3441 --- /dev/null +++ b/src/keyed-element @@ -0,0 +1,94 @@ +# 主题 + +单个元素 JSX Element Key 属性定义与效果 + +## 简单示例 + +```tsx +const Test = () => { + + const values = { + A: "100", + B: "200", + C: "300", + }; + let selected = "A"; + + return ( +
+ {Object.keys(values).map((key) => { + return ( + + ); + })} + { + values[selected] = e.target.value; + }} + /> +
+ ); +}; +``` + +在上述示例中,定义了一组 button。点击 button 后,表示选中 values 的对应字段。此时可以编辑 values 对应字段下的内容。 + +## 发起动机 + +```tsx +const Test = () => { + + const values = { + A: "100", + B: "200", + C: "300", + }; + let selected = "A"; + + return ( +
+ {Object.keys(values).map((key) => { + return ( + + ); + })} + { + values[selected] = e.target.value; + }} + /> +
+ ); +}; +``` + +在如上代码,使用了 value 字段后,必须通过更改 `values[selected]` 字段来达到目的。 + +此时的 onChange 无法做节流,去抖动等操作。 + +--- + +这里建议元素增加 `key` 属性,与 defaultValue。defaultValue 不会与 `values[selected]` 绑定,但是用于组件初始化时显示对应的值。 + +此时,用户与元素交互,不会影响到 `values[selected]` 值,但是会直接作用于视图。工程师此时可以对 onChange 等一些 handler 做节流操作。 + +但由于 defaultValue 只有初始化时会生效,在点击 button 后,input 不会更新视图值。 + +将 `key` 放置于元素上,当 key 发生变化时,input 元素重新生成,并且使用对应的 defaultValue 初始化 + +## 影响分析 + +暂无 \ No newline at end of file -- Gitee