自定义hooks

29 篇文章 1 订阅

自定义传参hooks

把大多数的通用代码,或者props,抽成一个hooks,用hooks实现上下文,就不用再一一传参了

  1. 实现原理,主要是通过createContext, useContext,生产-消费者模式。用于大量props一层一层传参。
    导入useContext,该函数接受createContext()的返回值,返回的结果为该context的当前值,当前的context值由上层组件中距离当前组件最近的<MyContext.Provider>的value props决定。
  2. hooks实现代码。
import {createContext, useContex} from 'react';
const CanvasContext = createContext(null);
const CanvasProvider = ({children, setProps, setRootCustom, nodes, ...props}) => {
	const selectoRef = useRef(null);
    const movableRef = useRef(null);
    const canvasRef = useRef(null);
    const [targets, setTargets] = useState([]);
    const [boundBool, setBoundBool] = useState(false);
    return (
    <CanvasContext.Provider
            value={{
                selectoRef,
                movableRef,
                canvasRef,
                nodes,
                targets,
                boundBool,
                setTargets,
                setBoundBool,
                ...props,
            }}
        >
            {children}
        </CanvasContext.Provider>)
}

export {CanvasProvider, useCanvas: CanvasContext};
  1. hooks使用代码。给父组件嵌套一层生产者组件,在里面的子组件里面直接使用hooks就可以
function DrawCanva(props) { 
	return (
		<CanvasProvider {...{state, nodes, ...component}}>
           <Canvas/>
        </CanvasProvider>
	)
}
function Canvas() { 
	 const {state, targets, nodes, canvasRef, movableRef, setProps, rootCustom, setRootCustom} = useCanvas();
	 return (
	 <div>
	 	你自己的代码
	 	<ChidComponent />
	 </div>
	 )
}
const ChidComponent  = () => {
	 const {state, targets, nodes, canvasRef, movableRef, setProps, rootCustom, setRootCustom} = useCanvas();
	 return (
	 <div>
	 	你自己的代码
	 </div>
	 )
}

自定义控制浏览器标题hooks

用来控制浏览器标题,暴露设置标题的方法,设置标题之后,通过依赖更新标题

实现原理:保存标题的state

  1. hooks定义代码
import { useState, useEffect } from 'react';

function useTitle(initialTitle) {
  const [title, setTitle] = useState(initialTitle);
 
  useEffect(() => {
    document.title = title;
  }, [title]);

  return setTitle;
}
  1. hooks使用代码
function Page() {
  const setTitle = useTitle('prev title');
 
  return (
    <Button onClick={() => setTitle('test title‘)}>
      Click me
    </Button>
  )
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值