封装useContext

import { ref } from 'vue';
import type { Ref } from 'vue';
import { useContext } from '@/hooks';

interface DemoContext {
  counts: Ref<number>;
  setCounts: (count: number) => void;
}

const { useProvide: useDemoProvide, useInject: useDemoInject } = useContext<DemoContext>();

export function useDemoContext() {
  const counts = ref(0);

  function setCounts(count: number) {
    counts.value = count;
  }

  const demoContext: DemoContext = {
    counts,
    setCounts
  };

  function useProvide() {
    return useDemoProvide(demoContext);
  }

  return {
    useProvide,
    useInject: useDemoInject
  };
}

// 示例用法: A.vue为父组件, B.vue为子孙组件 C.vue为子孙组件
// A.vue
// import { useDemoContext } from '@/context';
// const { useProvide } = useDemoContext();
// const { counts, setCounts } = useProvide();

// B.vue 和 C.vue : 共享状态 counts
// import { useDemoContext } from '@/context';
// const { useInject } = useDemoContext();
// const { counts, setCounts } = useInject();

useContextuseReducer都是React的Hook函数,用于处理状态管理和组件之间的数据传递。 1. useContext:用于在组件中获取和共享全局状态。它接收一个Context对象作为参数,并返回该Context的当前值。这个值是由最近的上层Context.Provider组件提供的。使用useContext可以避免使用props将状态传递到多个嵌套组件中。 例子: ```javascript const MyContext = React.createContext(); function ParentComponent() { const value = "Hello, useContext!"; return ( <MyContext.Provider value={value}> <ChildComponent /> </MyContext.Provider> ); } function ChildComponent() { const contextValue = React.useContext(MyContext); return <div>{contextValue}</div>; } ``` 2. useReducer:用于管理复杂的状态逻辑。它接收一个reducer函数和初始状态作为参数,并返回当前状态和dispatch函数。reducer函数接收当前状态和action作为参数,并根据action类型来更新状态。使用useReducer可以将状态和对状态的更新逻辑封装在一个函数中,使组件更加清晰和可维护。 例子: ```javascript function reducer(state, action) { switch (action.type) { case 'INCREMENT': return { count: state.count + 1 }; case 'DECREMENT': return { count: state.count - 1 }; default: throw new Error(); } } function Counter() { const [state, dispatch] = React.useReducer(reducer, { count: 0 }); return ( <div> Count: {state.count} <button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button> <button onClick={() => dispatch({ type: 'DECREMENT' })}>-</button> </div> ); } ``` 总结: - useContext用于获取全局状态,避免了props的传递,适用于简单的状态共享。 - useReducer用于管理复杂的状态逻辑,将状态和更新逻辑封装在一个函数中,适用于较为复杂的状态管理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天吃饭的羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值