如何向组件树的第一个子组件传递变量且不让嵌套子组件访问
实现方案
方案1:直接通过props透传(最推荐)
默认Provider提供的Context本身就是面向所有后代组件可访问的,如果你只需要给直接子组件DivA传值,完全不需要用Context传递这个变量,直接给DivA注入props即可,内层组件不会主动拿到这个值:
import React from 'react' const Provider = ({ children }) => { // 你的内部变量 const num = 100 // 给直接子元素注入props,仅直接子组件可获得 const childWithNum = React.cloneElement(children, { num }) return <>{childWithNum}</> }
你只需要在DivA组件内部通过props接收num即可,只要你不在DivA里主动把num传递给DivB,所有内层嵌套的组件都访问不到这个变量。
方案2:适配多直接子组件的场景
如果Provider的直接子元素不只有DivA,你可以通过组件标记筛选,只给目标组件传值:
import React from 'react' const Provider = ({ children }) => { const num = 100 const processedChildren = React.Children.map(children, child => { // 仅给DivA组件传递num属性,需要提前给DivA设置displayName if (React.isValidElement(child) && child.type.displayName === 'DivA') { return React.cloneElement(child, { num }) } return child }) return <>{processedChildren}</> } // 给DivA添加标记 DivA.displayName = 'DivA'
不推荐的Context方案说明
如果你一定要用Context传递num,要避免内层组件访问的话,需要在DivA组件内部用同个Context的Provider把值覆盖为undefined,但这种实现冗余且容易出问题,远不如直接传props的方案简洁可靠。
内容的提问来源于stack exchange,提问作者Yahli Gitzi
相关产品推荐
相关产品推荐

