首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

useContext -当我在子级中设置状态时,父级不会呈现

useContext是React中的一个Hook,用于在组件之间共享状态。

当在子级组件中使用useContext设置状态时,父级组件不会重新渲染。这是因为useContext使用了React的上下文(Context)机制,它可以让我们在组件树中传递数据,而不需要手动通过props一层层传递。

使用useContext的步骤如下:

  1. 在父级组件中创建一个上下文对象,可以使用React.createContext()方法来创建。
  2. 在父级组件中使用上下文对象的Provider组件包裹子组件,并通过value属性传递需要共享的状态。
  3. 在子级组件中使用useContext钩子函数来获取父级组件传递的状态。

父级组件不会重新渲染的原因是,React在进行组件渲染时,会比较组件的props和state是否发生变化,如果没有变化,则不会重新渲染组件。而使用useContext设置的状态并不会触发父级组件的props或state的变化,因此父级组件不会重新渲染。

useContext的优势在于可以简化组件之间的状态传递,特别是在组件层级较深的情况下。它可以避免通过props一层层传递状态,使代码更加简洁和易于维护。

useContext的应用场景包括但不限于:

  • 在多个组件之间共享全局状态,例如用户登录信息、主题设置等。
  • 在复杂的组件树中传递数据,避免props的层层传递。
  • 在跨组件的事件处理中传递数据。

腾讯云相关产品中,没有直接对应useContext的产品或服务。但腾讯云提供了丰富的云计算产品和服务,例如云服务器、云数据库、云存储等,可以用于构建和部署云原生应用、进行网络通信和安全保护、处理音视频和多媒体等。具体产品和服务的介绍可以参考腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

react 基础操作-语法、特性 、路由配置

React 函数组件,组件的渲染是由状态(state)和属性(props)的变化触发的,而直接在函数组件定义的变量并不会引起组件的重新渲染。...这个方法会阻止事件进一步冒泡到元素或其他监听同一事件的元素上。...需要注意的是, React ,event.stopPropagation() 方法并不会阻止事件组件内部的其他事件处理函数中继续执行,只会阻止事件冒泡到元素上。...,确保了事件不会触发元素上的点击事件处理函数。...: 用于路由组件渲染路由组件。 Navigate:用于执行编程式导航操作。 Match:用于条件渲染组件,根据当前路由匹配结果来确定是否渲染。

24720

Vue3 的 7 种和 Vue2 的 12 种组件通信,值得收藏

如果组件是纯 Vue3 写法,组件混合写法,可以通过 props 接收到 data 和 setup 函数里的属性,但是组件要是 setup 里接收,同样只能接收到组件 setup 函数里的属性...组件接收到数据之后,不能直接修改组件的数据。会报错,所以当组件重新渲染,数据会被覆盖。如果子组件内要修改的话推荐使用 computed。...page:1 } }}// Child.vueexport default { props:["page"], computed(){ // 当我组件里修改...$attrs / $listeners多层嵌套组件传递数据,如果只是传递数据,而不做中间处理的话就可以用这个,比如组件向孙子组件传递数据$attrs:包含作用域里除 class 和 style...$parent.name // 获取组件的属性 }}8. provide / injectprovide / inject 为依赖注入,说是不推荐直接用于应用程序代码,但是一些插件或组件库里却是被常用

15532
  • 手写一个React-Redux,玩转React的Context API

    上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库。...这个库的作用是将Redux的状态机和React的UI呈现绑定在一起,当你dispatch action改变state的时候,会自动更新页面。...->这种单向数据流,如果他们的一个公用变量变化了,肯定是组件先更新,然后参数传给组件再更新,但是Redux里,数据变成了Redux -> ,Redux -> 完全可以根据Redux...的数据进行独立更新,而不能完全保证先更新,再更新的流程。...为了解决组件和组件各自独立依赖Redux,破坏了React的->的更新流程,React-Redux使用Subscription类自己管理了一套通知流程。

    3.7K21

    vue2升vue3:provide与inject 使用注意事项

    VUE provide 和 inject 使用场景当我们需要从父组件向组件传递数据,我们使用 props。而一些深度嵌套的组件,深层的组件只需要组件的部分内容。...无论组件层次结构有多深,组件都可以作为其所有组件的依赖提供者。组件有一个 provide 选项来提供数据,组件有一个 inject 选项来开始使用这些数据。...当然熟悉react的,还可以参考:https://github.com/zephraph/vue-context-apivue2.x中使用provide 和 inject组件export default...')    return{      site    }  }}上述示例,组件或组件都会修改 info 的值。...就是数据在哪,修改只能在哪,不能在数据传递处修改数据,容易造成状态不可预测。订阅组件内修改值的时候,可以被正常修改,如果其他组件也使用该值的时候,状态容易造成混乱,所以需要在源头上规避问题。

    1.3K10

    React Hook实践指南

    设置相同的state值setState会bailing out of update 如果setState接收到的新的state和当前的state是一样的(判断方法是Object.is),React将不会重新渲染组件或者触发...作用 我们知道React组件之间传递参数的方式是props,假如我们组件定义了某些状态,而这些状态需要在该组件深层次嵌套的组件中被使用的话就需要将这些状态以props的形式层层传递,这就造成了...为了解决这个问题,React允许我们使用Context来组件和底下任意层次的组件之间传递状态。...而由于useState返回的setState可以直接在任意地方设置我们状态的值,当我们组件的状态转换逻辑十分复杂,它将很难debug,因为它是开放的状态管理。...状态定义组件,不过需要在深层次嵌套的组件中使用和改变组件的状态,可以同时使用useReducer和useContext两个hook,将dispatch方法放进context里面来避免组件的props

    2.5K10

    前端系列14集-Vue3-setup

    Vue.js ,对一个响应式对象进行操作,Vue.js 会将其包装在一个代理对象内部,以便追踪该对象上属性的变化,并在需要更新视图。...当我们增加计数器的值,state.count 的值被更新为 1,但 toRaw(state).count 仍然为初始值 0,因为它没有受到反应性系统的管理。...  是直接可用的 defineProps 代替props,接收组件传递的数据(组件向组件传参)   组件   <Child.../child.vue' const msg = ref('的值')  //自动返回,template直接解套使用  可以直接使用组件传递的props <...markRaw标记一个对象,使其永远不会转换为响应式数据,只能返回这个对象本身,一般用于某些值不该被设置为响应式的,比如第三方类实例或vue对象等场景。

    45020

    从react源码看hooks的原理_2023-03-01

    有这样的一道面试题: // 点击组件里面的按钮,会不会组件里面打印“组件渲染了”?如果会,该怎么优化?...,保证了每一次组件更新不会重新创建函数堆,而是获取之前的引用,传递给组件的属性就没有变化,例如: // 组件 import Child from '....假如有ABCDE五个组件嵌套,你用props传值,是不是要A传到B...一直传到E,但是useContext就可以E组件里面直接获取到A的状态,举个例子: const ComponentA = ()...创建上下文 const Content = createContext(null); // 组件里面用Content.Provider包裹组件,指定上下文范围 const ComponentA...{(count)=>来自A的count:{count}} ) } 可见不用从useContext解构出来

    87020

    一口气复习完 Vue3 相关基础知识点

    多个根节点编辑器不会报错 Vue3是允许我们有多个根节点的,但是我们如果使用Vetur就会报错,不会影响运行,但是看起来就很烦。所以当我们转向Volar那么就不会出现这个问题了。...setup的参数(props,context)` props: 是一个对象,里面有组件向组件传递的数据,并且是组件中使用props接收到的所有的属性 context:上下文对象,可以通过es6...以下是直接引用 官网的原文 v-enter-from:定义进入过渡的开始状态元素被插入之前生效,元素被插入之后的下一帧移除。 v-enter-active:定义进入过渡生效状态。...元素被插入之后下一帧生效 (与此同时 v-enter-from 被移除),在过渡/动画完成之后移除。 v-leave-from:定义离开过渡的开始状态离开过渡被触发立刻生效,下一帧被移除。...v-leave-active:定义离开过渡生效状态整个离开过渡的阶段应用,离开过渡被触发立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

    2.1K40

    整理的一些 Vue3 知识点

    多个根节点编辑器不会报错 Vue3是允许我们有多个根节点的,但是我们如果使用Vetur就会报错,不会影响运行,但是看起来就很烦。所以当我们转向Volar那么就不会出现这个问题了。...setup的参数(props,context)` props: 是一个对象,里面有组件向组件传递的数据,并且是组件中使用props接收到的所有的属性 context:上下文对象,可以通过es6...以下是直接引用 官网的原文 v-enter-from:定义进入过渡的开始状态元素被插入之前生效,元素被插入之后的下一帧移除。 v-enter-active:定义进入过渡生效状态。...元素被插入之后下一帧生效 (与此同时 v-enter-from 被移除),在过渡/动画完成之后移除。 v-leave-from:定义离开过渡的开始状态离开过渡被触发立刻生效,下一帧被移除。...v-leave-active:定义离开过渡生效状态整个离开过渡的阶段应用,离开过渡被触发立刻生效,在过渡/动画完成之后移除。这个类可以被用来定义离开过渡的过程时间,延迟和曲线函数。

    2.5K30

    【初学者笔记】整理的一些Vue3知识点

    多个根节点编辑器不会报错 Vue3是允许我们有多个根节点的,但是我们如果使用Vetur就会报错,不会影响运行,但是看起来就很烦。 所以当我们转向Volar那么就不会出现这个问题了。...setup的参数(props,context)` props: 是一个对象,里面有组件向组件传递的数据,并且是组件中使用props接收到的所有的属性 context:上下文对象,可以通过es6...以下是直接引用 官网的原文 v-enter-from:定义进入过渡的开始状态元素被插入之前生效,元素被插入之后的下一帧移除。 v-enter-active:定义进入过渡生效状态。...整个进入过渡的阶段应用,元素被插入之前生效,在过渡/动画完成之后移除。这个类可以被用来定义进入过渡的过程时间,延迟和曲线函数。 v-enter-to:定义进入过渡的结束状态。...离开过渡被触发立刻生效,下一帧被移除。 v-leave-active:定义离开过渡生效状态整个离开过渡的阶段应用,离开过渡被触发立刻生效,在过渡/动画完成之后移除。

    2.4K30

    React Hook | 必 学 的 9 个 钩子

    函数组件顶层调用 函数中使用 / 自定义 Hook 中使用 ❞ React 内置的 Hook ❝ useState 状态管理 useEffect 生命周期管理 useContext...组件暴露值/方法 useLayoutEffect完成副作用操作,会阻塞浏览器绘制 ❞ useState 状态管理 ❝ class 组件,我们获取 state 是 通过 this.state...作用: 获取Dom操作,例如 获取 input 焦点 获取组件的实例(只有类组件可用) 函数组件的一个全局变量,不会因为重复 render 重复申明 ❞ 栗子 import {useRef} from...状态数据共享 Context 解决了什么 ❝日常开发,我们父子组件都是通过props 来进行通信,如果遇到跨组件通信 那么我们就不好通过 props 来处理了。...useImperativeHandle作用 : ❝组件可以暴露给组件 实例使用 ❞ 格式: useImperativeHandle(ref,()=>{},[]) 参数1:组件向组件暴露的实例

    1.1K20

    React 为什么重新渲染

    实际上,当状态发生改变的时候,React 只会更新「拥有这个状态」的组件,和这个组件的所有组件。 为什么组件(在这个例子, 是 的组件)没有发生更新呢?...为了避免向用户展示过时的 UI,当组件更新,React 会更新所有组件,即使组件不接受任何 prop。props 和组件更新没有任何关系。...); 当我们将 组件的声明包裹在 memo ,我们实际上做的是告诉 React「嘿!...当一个包裹在 memo 的组件使用了 useState、useReducer 或者 useContext,当这个组件内的状态发生改变,这个组件仍然会更新。...如果说,当一个组件由于状态改变而更新,其所有组件都要随之更新。那么当我们通过 Context 传递的状态发生改变,订阅了这个 Context 的所有组件都要更新也是毫不意外的了。

    1.7K30

    120. 精读《React Hooks 最佳实践》

    推荐使用 React.useMemo 而不是 React.memo,因为组件通信存在 React.useContext 的用法,这种用法会使所有用到的组件重渲染,只有 React.useMemo 能处理这种场景的按需渲染...useReducer 局部状态不推荐使用 useReducer ,会导致函数内部状态过于复杂,难以阅读。 useReducer 建议多组件间通信,结合 useContext 一起使用。...虽然看上去 只是将更新 id 的时机交给了元素 ,但由于 onChange 函数每次渲染都会重新生成,因此引用总是变化,就会出现一个无限死循环: 新 onChange...-> useEffect 依赖更新 -> props.onChange -> 重渲染 -> 新 onChange......因此使用 useEffect 要注意调试上下文,注意传递的参数引用是否正确,如果引用传递不正确,有两种做法: 使用 useDeepCompareEffect 对依赖进行深比较。

    1.2K10

    React Hook丨用好这9个钩子,所向披靡

    组件之间状态复用, 例如:使用useContext 可以很好的解决状态复用问题,或者自定义Hook 来定制符合自己业务场景遇到的状态管理。 函数组件 生命周期的使用,更好的设计封装组件。...函数组件顶层调用 函数中使用 / 自定义 Hook 中使用 React 内置的 Hook useState 状态管理 useEffect 生命周期管理 useContext 共享状态数据...作用: 获取Dom操作,例如 获取 input 焦点 获取组件的实例(只有类组件可用) 函数组件的一个全局变量,不会因为重复 render 重复申明 栗子 import {useRef} from...状态数据共享 Context 解决了什么 日常开发,我们父子组件都是通过props 来进行通信,如果遇到跨组件通信 那么我们就不好通过 props 来处理了。...useImperativeHandle作用 : 组件可以暴露给组件 实例使用 格式: useImperativeHandle(ref,()=>{},[]) 参数1: 组件向组件暴露的实例 参数

    2.3K31

    react-hooks如何使用?

    console.log(number) /* 这里的number是不能够即使改变的 */ } } > ) } 上边简单的例子说明了useState ,但是当我调用更新函数之后...5 useContext 自由获取context 我们可以使用useContext ,来获取组件传递过来的context值,这个当前值就是最近的组件 Provider 设置的value值,useContext...参数一般是由 createContext 方式引入 ,也可以上下文context传递 ( 参数为context )。...redux useReducer 是react-hooks提供的能够状态组件运行的类似redux的功能api,至于它到底能不能代替redux react-redux ,我个人的看法是不能的 ,redux...,由于是无状态组件每一次都会重新生成新的props函数,这样就使得每一次传递给组件的函数都发生了变化,这时候就会触发组件的更新,这些更新是没有必要的,此时我们就可以通过usecallback来处理此函数

    3.5K80
    领券