十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

enzyme ShallowWrapper.key() 方法详解:读取 React 节点的 key 值

enzyme ShallowWrapper.key() 方法详解:读取 React 节点的 key 值 测试前端【免费下载链接】enzymeJavaScript Testing utilities for React项目地址https://gitcode.com/gh_mirrors/en/enzyme点击查看免费下载导读.key()是 enzyme 中 ShallowWrapper 提供的一个节点属性读取方法用于返回当前 wrapper 所包裹节点的 Reactkey值。在列表渲染、key 驱动的组件复用与差分diff等场景的测试断言中它是最直接、最可靠地验证 key 是否正确传入的 API。读完本文你将掌握.key()的返回值规则、单节点调用约束、底层实现原理以及如何在 shallow 与 mount 两种渲染模式下编写 key 相关的测试用例。方法签名与基本语义根据 docs/api/ShallowWrapper/key.md 的定义.key() Stringkey()返回当前 wrapper 所包裹节点的 key 值并且要求当前 wrapper 必须只包含单个节点single-node wrapper。它与prop(key)不同key()直接读取 React 内部节点的 key 字段而prop(key)读取的是 props 对象中名为key的属性React 中 key 并不存在于常规 props 中因此后者通常拿不到 key。React 的key用于在列表渲染中标识元素的身份帮助 React 在更新时进行高效的节点复用与重排。key()让测试能够断言渲染结果中每个元素的 key 是否符合预期从而间接验证列表数据的映射逻辑是否正确。返回值规则undefined 与空字符串的区别从源码实现看key()的返回值逻辑非常精确。在 packages/enzyme/src/ShallowWrapper.js#L1375-L1377 中key() { return this.single(key, (n) (n.key undefined ? null : n.key)); }其返回值规则可以总结为场景返回值节点上显式设置了key如keyfoo返回该 key 的字符串值节点设置了空字符串key返回空字符串注意不是 null节点完全没有指定key内部为undefined返回null这里的关键细节是空字符串 key 与未设置 key 是两种不同的状态。源码只有在n.key undefined时才归一化为null因此key会原样返回空字符串。测试用例 packages/enzyme-test-suite/test/shared/methods/key.jsx 明确验证了这一点it(returns the key of the node, () { const wrapper Wrap(( ul {[foo, bar, ].map((s) li key{s}{s}/li)} /ul )).find(li); expect(wrapper.at(0).key()).to.equal(foo); expect(wrapper.at(1).key()).to.equal(bar); expect(wrapper.at(2).key()).to.equal(); }); it(returns null when no key is specified, () { const wrapper Wrap(( ul lifoo/li /ul )).find(li); expect(wrapper.key()).to.equal(null); });单节点约束single() 强制校验机制key()内部通过this.single(key, fn)执行其单节点约束由single工具方法保证。在 packages/enzyme/src/ShallowWrapper.js#L1647-L1654 中可以看到single(name, fn) { const fnName typeof name string ? name : unknown; const callback typeof fn function ? fn : name; if (this.length ! 1) { throw new Error(Method “${fnName}” is meant to be run on 1 node. ${this.length} found instead.); } return callback.call(this, this.getNodeInternal()); }这意味着如果直接对一个包含多个节点的 wrapper 调用key()会抛出如下错误Method key is meant to be run on 1 node. 2 found instead.因此在实际使用中key()通常与find()、at()、first()、last()等缩窄节点范围的方法配合使用先定位到唯一节点再读取其 key。ReactWrapper 版本的单节点校验机制完全一致见 packages/enzyme/src/ReactWrapper.js#L1167-L1174。完整示例shallow 与 mount 两种模式key()在 ShallowWrapper 与 ReactWrapper 上均可使用两者文档一致ShallowWrapper 版、ReactWrapper 版区别仅在于渲染深度shallow只渲染当前组件一层mount则进行完整 DOM 渲染。使用 shallowimport { shallow } from enzyme; import { expect } from chai; const wrapper shallow(( ul {[foo, bar].map((s) li key{s}{s}/li)} /ul )).find(li); expect(wrapper.at(0).key()).to.equal(foo); expect(wrapper.at(1).key()).to.equal(bar);使用 mountimport { mount } from enzyme; import { expect } from chai; const wrapper mount(( ul {[foo, bar].map((s) li key{s}{s}/li)} /ul )).find(li); expect(wrapper.at(0).key()).to.equal(foo); expect(wrapper.at(1).key()).to.equal(bar);两个示例的共同模式是通过map()依据数据数组动态生成带 key 的li节点用find(li)找到全部li用at(index)逐一定位单个节点用key()断言每个节点的 key 与源数据一一对应。这样便完成了数据 → key → 渲染结果的闭环验证。底层原理key 存储在 React 元素内部从源码结构看key()读取的并非 props而是 React 元素对象内部与props平级的key字段。single()通过this.getNodeInternal()取得当前节点的内部表示回调函数直接访问该对象的.key属性(n) (n.key undefined ? null : n.key)这解释了为什么key()对未设置 key 的节点返回null而不是undefinedenzyme 有意将未定义归一化为null使测试断言更简洁、类型更稳定。同时由于读的是内部节点字段而非props.key即使 key 没有进入组件 propskey()依然能够准确返回。ReactWrapper 中的实现与 ShallowWrapper 完全相同见 packages/enzyme/src/ReactWrapper.js#L892-L899两个 wrapper 类共用同一套语义便于开发者无差别切换渲染模式。测试套件中的验证与覆盖key()的行为由 enzyme 自带的共享测试套件持续验证。测试文件 packages/enzyme-test-suite/test/shared/methods/key.jsx 通过describeKey导出一组用例并由describeMethods辅助函数以动态 require 的方式批量注入到 ShallowWrapper 与 ReactWrapper 各自的 spec 中。具体来说packages/enzyme-test-suite/test/_helpers/describeMethods.js#L11-L23 遍历方法名列表执行require(../shared/methods/${method})加载对应测试文件packages/enzyme-test-suite/test/ShallowWrapper-spec.jsx#L1258-L1326 的方法列表中包含key见第 1297 行packages/enzyme-test-suite/test/ReactWrapper-spec.jsx#L1040-L1094 的方法列表同样包含key见第 1079 行。也就是说同一份key.jsx测试用例会在 shallow 与 mount 两种模式下各跑一遍覆盖了返回 key 值含空字符串场景与未设置 key 返回 null两条核心行为路径。常见使用场景与注意事项场景一验证列表渲染的 key 分配当组件内部对数组进行map渲染时key 是否正确分配直接影响 React 的更新性能与组件状态保留。通过find(...).map(node node.key())可以批量收集所有节点的 keyconst keys wrapper.find(li).map((node) node.key()); expect(keys).to.deep.equal([foo, bar]);场景二验证 key 的唯一性与稳定性结合everyWhere()或去重逻辑可以断言列表 key 无重复确保 React 差分时不会因 key 冲突产生渲染错误。注意事项key()只能用于单节点 wrapper对多节点 wrapper 调用会抛出 meant to be run on 1 node 错误务必先用at()、first()等定位空字符串 keykey返回与未设置 key 返回null不同断言时不要混淆key()返回的是字符串类型即使传入数字 keyReact 也会将其转为字符串断言时建议使用字符串字面量若只想断言某个节点上是否存在某个 prop可参考 docs/api/ShallowWrapper/prop.md但读取 key 请优先使用key()。小结.key()是 enzyme 中读取节点 key 的唯一专用 API返回规则清晰未设置返回null空字符串原样返回单节点约束严格且 shallow 与 mount 两种模式行为一致。配合find()、at()等导航方法它能够帮助开发者在测试中精准验证列表渲染的 key 分配逻辑是编写高质量 React 组件测试时值得掌握的基础方法之一。其行为有源码ShallowWrapper.js、ReactWrapper.js与共享测试套件key.jsx的双重保障可以放心在项目中使用。赞分享测试前端【免费下载链接】enzymeJavaScript Testing utilities for React项目地址https://gitcode.com/gh_mirrors/en/enzyme点击查看免费下载相关推荐enzyme ReactWrapper .key() 方法完全指南读取节点 React key 的返回值与实现原理enzyme ReactWrapper .key 方法完全指南读取节点 React key 的返回值与实现原理 ReactWrapper.key 是 enzy测试前端enzyme ReactWrapper .context([key]) 详解读取根组件 React Context 的正确姿势enzyme ReactWrapper .context key 详解读取根组件 React Context 的正确姿势 导读 在 enzyme 的 moun测试前端enzyme ReactWrapper.ref(refName) 方法详解按 ref 名称获取 React 组件实例或 DOM 节点enzyme ReactWrapper.ref refName 方法详解按 ref 名称获取 React 组件实例或 DOM 节点 导读 .ref refNa测试前端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表