React 最佳实践

使用React写业务也有挺长一段时间了,总结下我认为的最佳实践。

状态管理最佳实践

主流的状态管理多多少少都用过,多少都有学习成本。 真的有必要花大把时间去学其他的状态管理吗?真的实用吗?如果不是为了应付面试,我是不会花时间去了解那些状态管理的。

后面发现 useContext hook 完全够用,而且对逻辑的划分非常有帮助,真正做到了逻辑的复用。 如果你习惯用自定义 hook 去抽离逻辑,那么结合 useContext 会是个很棒的体验。

这是对 useContext 很棒的封装: github.com/jamiebuilds...

举例:

tsx 复制代码
import React, { useState } from 'react';
import { createContainer } from "unstated-next"
import { render } from "react-dom"

// 定义 A 相关的状态和逻辑
const useA = () => {
    const [a, setA] = useState(0)
    const handleChangeA = () => {
        setA(a + 1)
    }
    return {
        a,
        handleChangeA
    }
}
const AContainer = createContainer(useA)

// 定义 subType 相关的状态和逻辑
const subTypeMap = {
    0: 'all',
    1: 'active',
    2: 'completed'
}
const useSubTypeSelect = () => {
    const [subType, setSubType] = useState(0);
    const subTypeOptions = Object.entries(subTypeMap).map(([key, value]) => ({ value: key, label: value }))
    // ReactNode
    const subTypeNode = <div>
        <h5>subType: {subTypeMap[subType]} </h5>
        <ul>
            {subTypeOptions.map((item) => (
                <li
                    key={item.value}
                    onClick={() => setSubType(item.value)}
                >
                    {item.label}
                </li>
            ))}
        </ul>
    </div>
    // ... others
    return {
        subType,
        subTypeNode
    }
}
const SubTypeSelectContainer = createContainer(useSubTypeSelect)

// UI
const Main = () => {
    // 使用 A 模块相关状态和逻辑
    const { a, handleChangeA } = AContainer.useContainer()
    // 使用 subType 模块相关状态和逻辑
    const { subType, subTypeNode } = SubTypeSelectContainer.useContainer()
    return <div>
        {/* A */}
        <button onClick={handleChangeA}>A: {a}</button>
        {/* subTypeSelect */}
        {subTypeNode}
        {/* ... */}
    </div>
}


const App = () => {
    return (
        <AContainer.Provider>
            <SubTypeSelectContainer.Provider>
                <Main />
            </SubTypeSelectContainer.Provider>
        </AContainer.Provider>
    )
}

render(<App />, document.getElementById("root"))

效果:

state 与 queryString 联动

有些时候,你希望你的state在变更时同时变更URL里的queryString,那么可以这么做 ...

state 之间的联动

有些时候,改变某个state,其他state会受到影响 比如列表页,当我们变更筛选项或者排序时,需要初始化page,让page变为1, ...

请求的防抖

请求受到多个state影响,当多个state变更会导致请求触发多次,那么可以这么解决: ...

相关推荐
码丁_11712 分钟前
某it培训机构前端三阶段react及新增面试题
前端·react.js·前端框架
_pengliang27 分钟前
react native ios 2个modal第二个不显示
javascript·react native·react.js
我算哪枝小绿植1 小时前
react实现日历拖拽效果
前端·react.js·前端框架
OEC小胖胖1 小时前
04|从 Lane 位图到 `getNextLanes`:React 更新优先级与纠缠(Entangle)模型
前端·react.js·前端框架
愤怒的可乐1 小时前
从零构建大模型智能体:ReAct 智能体实战
前端·react.js·前端框架
BlackWolfSky1 小时前
React中文网课程笔记4—常用工具配置
前端·笔记·react.js
巾帼前端2 小时前
前端框架 React 的虚拟 DOM是如何在这一层层抽象中定位自己位置的?
前端·react.js·前端框架
wayne2142 小时前
React Native 0.80 学习参考:一个完整可运行的实战项目
学习·react native·react.js
光影少年2 小时前
你在 React 里具体做过哪些性能优化?
前端·react.js·性能优化
OEC小胖胖13 小时前
01|从 Monorepo 到发布产物:React 仓库全景与构建链路
前端·react.js·前端框架