react slots and HOC higher order components

react component slot


Way of writing:

<Table>内容</Table>
//react插槽在自定义组件的内容位置。

This is done using slots:

封装简单组件:在内容区域使用插槽
<Tab num={11} content="待收费数据(条)">
          <i className="iconfont iconfont-xingqudingxiang"></i>
</Tab>

Use of slots:

插槽内容默认在props属性上。属性为children

Specifically, the slots are divided into multiple

 <Tab num={11} content="待收费数据(条)">
          {
    
    {
            default: <i className="iconfont iconfont-xingqudingxiang"></i>,
            left: <button>左</button>,
            right: <button>右</button>,
          }}
</Tab>
//转为数据对下个格式
 let { num, content, children } = props;
  console.log(children);
  return (
    <>
      <div>
        <div>{children.default}</div>
        <div>
          <div>{num}</div>
          <div>{content}</div>
        </div>
        <div>
          <div>左:{children.left}</div>
          <div>右:{children.right}</div>
        </div>
      </div>
    </>
  );

Actual combat: Modal box in the project

dialog.jsx
import { useEffect, useState } from "react";
import "../assets/css/dialog.css";
export default (props) => {
  let { children, hidden,onUpdate } = props;
  let [show, setShow] = useState(hidden);
  //监听hidden
  useEffect(() => {
    setShow(hidden);
  }, [hidden]);
  let confirm = () => {
    setShow(false);
    onUpdate();
  };
  let cancel = () => {
    setShow(false);
    onUpdate();
  };
  //hidden控制模态框显示隐藏
  if (show) {
    return (
      <>
        <div className="dialog">
          <div className="dialog-center">
            {/* 标题 */}
            <p>{children}</p>
            <div>内容</div>
            <div>
              <button onClick={confirm}>确定</button>
              <button onClick={cancel}>取消</button>
            </div>
          </div>
        </div>
      </>
    );
  } else return null;
};

Button authentication


Use HOC to do it.

What are HOCs?

Higher-order components (HOC) are an advanced technique in React for reusing component logic. HOC itself is not part of the React API, it is a design pattern based on the composition characteristics of React.

effect:

Business logic used to reuse components.

vue   mixin
react HOC
做公用逻辑复用

User data rendering with action button rendering:

analyze:

Use HOC to complete button authentication.

How to write Hoc:

高阶组件是参数为组件,返回值为新组件的函数。
function buttonHoc(wrapComponent){
    return class组件
}
function buttonHoc(wrapComponent){
    return ()=>{
        return <></>
    }
}

Create button HOC advanced

//HOC 按钮鉴权高阶
//WrapComponent  被包裹组件
export default (WrapComponent) => {
  //返回全新函数组件
  return () => {
    return (
      <>
        <div>HOC组件</div>
      </>
    );
  };
};

Higher-order components are used by ordinary components

//引入HOC高阶
import ButtonHOC from "./ButtonHoc";
let Button = (props) => {
  let { label } = props;
  return (
    <>
      <button>{label}</button>
    </>
  );
};
//使用高阶组件
export default ButtonHOC(Button);

The component mounts the high-order component to run (there is no unwrapped component in the high-order component, so only HOC is seen)

Output wrapped components in HOC components

//HOC 按钮鉴权高阶
//WrapComponent  被包裹组件  高阶组件形参首字母大写
export default (WrapComponent) => {
  //返回全新函数组件
  return () => {
    return (
      <>
        <WrapComponent />
      </>
    );
  };
};
以上效果不正常,按钮组件props没有值。
因为HOC高阶组件没有向下传递props

Pass props down in the HOC component.

//HOC 按钮鉴权高阶
//WrapComponent  被包裹组件  高阶组件形参首字母大写
export default (WrapComponent) => {
  //返回全新函数组件
  return (props) => {
    console.log(props);
    return (
      <>
        {/* ...是扩展props自定义组件属性传值  延申 */}
        <WrapComponent {...props} />
      </>
    );
  };
};

button permissions

当前用户登录,开发服务器会返回当前用户的权限。
//HOC 按钮鉴权高阶

//HOC 按钮鉴权高阶

import { useState } from "react";

//WrapComponent  被包裹组件  高阶组件形参首字母大写
export default (WrapComponent) => {
  //返回全新函数组件
  return (props) => {
    //获取当前权限
    let { premission } = props;
    //模拟用户的权限数据
    //"admin:user:delete" "admin:user:update"   "*:*:*"
    let [prem, setPrem] = useState(["*:*:*"]);

    //如果是全部权限 直接渲染
    let Index = null;
    if (prem[0] == "*:*:*") Index = 0;
    else Index = prem.indexOf(premission);
    return (
      <>
        {/* ...是扩展props自定义组件属性传值  延申 */}
        {Index != -1 ? <WrapComponent {...props} /> : null}
      </>
    );
  };
};

How react uses routing


1.react-router
   1.react-router-dom  操作浏览器端路由
   2.react-router-native 操作native

Learn react-router-dom routing

Document address:

https://reactrouter.com/en/v6.3.0/api
//英文文档

Install react-router-dom


cnpm i --save-dev react-router-dom
"react-router-dom": "^6.9.0",

You need to know that built-in components are mainly used in react-router-dom to configure routing

<BrowserRouter></BrowserRouter>  history路由
<HashRouter></HashRouter>    hash路由#
 <BrowserRouter>
    {/* The rest of your app goes here */}
    //中间位置补路由配置
  </BrowserRouter>,

Start configuring your routing structure with built-in components

Use the built-in components Routes and Route components

Routes 为路由的配置区域  相当于路由的出口
Route 是详细路由配置
 <BrowserRouter>
        {/* 路由配置 */}
        <Route></Route>
</BrowserRouter>
//以上这种写法报错

Adjusted code structure

   <BrowserRouter>
        {/* 路由配置 */}
        <Routes>
          <Route></Route>
        </Routes>
   </BrowserRouter>

Start configuring routing

  <Route path="/admin" element={}></Route>
  path  路由路径
  element 路由的组件

First-level routing after configuration

  <BrowserRouter>
        {/* 路由配置 */}
        <Routes>
          <Route path="/admin" element={<Admin />}></Route>
          <Route path="/login" element={<Login />}></Route>
        </Routes>
 </BrowserRouter>
 //上下一样
  <BrowserRouter>
        {/* 路由配置 */}
        <Routes>
          <Route path="/" element={<Admin />}></Route>
          <Route path="/login" element={<Login />}></Route>
        </Routes>
  </BrowserRouter>

If there is no/route in the first-level route configuration, route redirection is required

使用内置组件Navigate重定向
用法:
<Navigate to="/admin" />
to重定向路由的路径
replace 是否替换当前路由路径  replace={true}

<Navigate to="/admin" replace={true} />

Routing configuration non-routing path into 404 components

//引入路由模块
import { BrowserRouter, Route, Routes, Navigate } from "react-router-dom";
//引入路由组件
import Admin from "./views/Admin";
import Login from "./views/Login";
import NotFound from "./views/not-found";
export default () => {
  return (
    <>
      <BrowserRouter>
        {/* 路由配置 */}
        <Routes>
          <Route path="/admin" element={<Admin />}></Route>
          <Route path="/login" element={<Login />}></Route>
          <Route
            path="/"
            element={<Navigate to="/admin" replace={true} />}
          ></Route>
          <Route path="*" element={<NotFound />}></Route>
        </Routes>
      </BrowserRouter>
    </>
  );
};

//或者添加404路由
 <BrowserRouter>
        {/* 路由配置 */}
        <Routes>
          <Route path="/admin" element={<Admin />}></Route>
          <Route path="/login" element={<Login />}></Route>
          <Route
            path="/"
            element={<Navigate to="/admin" replace={true} />}
          ></Route>
          <Route path="/not-found" element={<NotFound />}></Route>
          <Route
            path="*"
            element={<Navigate to="/not-found" replace={true} />}
          ></Route>
        </Routes>
</BrowserRouter>

Guess you like

Origin blog.csdn.net/m0_74331185/article/details/129760181