博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
React hooks 的尝试使用
阅读量:6824 次
发布时间:2019-06-26

本文共 3014 字,大约阅读时间需要 10 分钟。

React Hooks出来也已经挺久了,一直苦于没有机会去尝试。这次不用不知道,一用吓一跳,用hooks写页面和组件真的是太爽啦!再也不用写冗余的类,不用维护复杂的state和考虑异步的setState,不用考虑this的指向,不用细想在哪个生命周期里执行复杂的逻辑,写起来只能用行云流水来形容。如果你还在犹豫要不要使用hooks,请大胆的去尝鲜吧!(p.s:记得把react升级到16.8版本)


这里就不介绍hooks是什么,只是记录了一些我在项目里hooks的一些用法。如果想详细了解hooks的话,我推荐去看官方文档和一些入门文章

传送门:


Hooks只能用在纯函数组件里

以前组件通信,要么使用props一层层传递下去,要么使用Redux等状态管理架构。这些方法冗余,繁琐,易出错。

Hooks的出现,带给了我们新的解决这些问题的方法。

1.使用useContext实现组件间通信

import React, { createContext, useContext } from 'react';// 创建Context  const Context = createContext(defaultContext);// 顶层组件提供共享状态值
{childrenComponents}
// 子组件调用状态值function childComponents() { const shareContext = useContext(Context);}复制代码

2. 使用useReducer管理多个组件之间的状态

useReducer的基本概念与Redux一致,不了解的可以先去了解一下什么是action,dispatch,reducer之类的。

// actionsconst SOME_ACTIONS = 'SOME_ACTIONS';   // 定义action// reducerfunction reducer(state, action) {    switch(action.type) {        case SOME_ACTIONS:            /*handle state with action.payload*/            return nextState;        default:            return state;    }}const iniState = /*初始状态*/// 组件里使用useReducerfuction Components() {    const [state, dispatch] = useReducer(reducer, iniState);        /* state 即为所共享的状态*/        /* 使用 dispatch 通过指定 action 修改 state 的值*/        dispatch({ type: ACTION_TYPE, payload: SOME_PROPS });}复制代码

3.使用各种hooks实现一个自定义hooks

我们可以根据需求设计自定义hooks。注意,自定义hooks一定要以useXXX的格式命名。具体原因可到官方文档去了解:

3.1 实现一个即插即用弹窗(基于antd Modal组件)

以前我们使用Modal组件,总是要自己维护一套state来控制Modal的visible,onCancel等设计比较固定的属性,带来冗余代码和形态各异的实现。而且需要提前引入组件,这会造成某些奇怪的问题和不必要的渲染。

// 控制Modal生命周期的hooks:// 组件的唯一id, 包裹组件的div, 组件props,回调函数function useModal(id = 'unique_id', WrapDiv, dataProps, callback) {    const [visible, setVisible] = useState(false);        function showModal() { // 显示modal        setVisible(true);    }        function destory() { // 销毁组件        const unmountResult = ReactDOM.unmountComponentAtNode(WrapDiv);        if (unmountResult && WrapDiv.parentNode) {          WrapDiv.parentNode.removeChild(WrapDiv);        }    }        function onCancel(data, runCallback = false) { // 关闭Modal并执行回调        callback && runCallback && callback(data);        setVisible(false);        destroy();    }        // 通过自定义hooks给Modal提供show方法和必要props    return [        showModal,        {            key: id,            visible,            onCancel,            ...dataProps,        },    ];}复制代码

使用useModal实现即插即用Modal:

function DirectiveModal({ DirectModal, id, WrapDiv, callback, ...props }) {  const [showModal, ModalProps] = useModal(id, WrapDiv, props, callback);  useEffect(() => {    showModal();  }, []);  // useEffect第二个参数为空数组表示该effect只执行一次  return (    
);}function createDirectiveModal(DirectModal, props) { // 相当于show方法 const WrapDiv = document.createElement('div'); document.body.appendChild(WrapDiv); function render() { ReactDOM.render(
, WrapDiv); } // 需要使用时才插入该组件 render();}export default createDirectiveModal;复制代码

4. 总结

灵活组合使用hooks能使我们编程更便利,代码逻辑更加清晰高效。自定义hooks带来的可拓展性更是潜力无穷。也难怪当初hooks出来的时候引爆互联网了。心动的快赶快把你的React升级到16.8,去体验hooks的无穷魅力吧!

转载地址:http://xhgzl.baihongyu.com/

你可能感兴趣的文章
inflate()引发NullPointerException
查看>>
[C++]unordered_map的使用
查看>>
cvReleaseImage()函数说明
查看>>
NoSQL设计思想(从辅到主)
查看>>
使用物化视图来同步数据on prebuilt table
查看>>
NYOJ176整数划分(二)
查看>>
zabbix-3.4 触发器
查看>>
[HNOI 2016] 树
查看>>
ribbon重试机制
查看>>
修改sql数据库文件 物理文件名称
查看>>
关于PHP 时区错误的问题
查看>>
ScriptManager.RegisterStartupScript失效的解决方案
查看>>
vsftpd 添加用户
查看>>
运行 python 脚本错误:urllib2.URLErroe:<urlopen error unknown url type : https>
查看>>
递归方法
查看>>
Sonar+maven+jenkins集成,Java代码走查
查看>>
浏览器渲染页过程描述
查看>>
js中点击返回顶部
查看>>
Gtest源码剖析:1.实现一个超级简单的测试框架xtest
查看>>
UEditor 是一套开源的在线HTML编辑器
查看>>