当前位置: 首页 > news >正文

响应式培训网站模板下载重庆网站关键词排名优化

响应式培训网站模板下载,重庆网站关键词排名优化,给孩子做的饭网站,动漫网站怎么做React 基础巩固(三十七)——自定义connect高阶组件 一、手撸一个自定义connect高阶组件 import { PureComponent } from "react"; import store from "../store";/*** connect的参数:* 参数一: 函数* 参数二: 函数* 返…

React 基础巩固(三十七)——自定义connect高阶组件

一、手撸一个自定义connect高阶组件

import { PureComponent } from "react";
import store from "../store";/*** connect的参数:* 参数一: 函数* 参数二: 函数* 返回值: 函数*/
export default function connect(mapStateToProps, mapDispatchToProps) {// 返回一个高阶组件,本质也是函数return function (WrapperComponent) {class NewComponent extends PureComponent {constructor(props) {super(props);// 将接收到的mapStateToProps赋给state,用于部分值修改时的浅层比较、更新statethis.state = mapStateToProps(store.getState());}componentDidMount() {this.unsubscribe = store.subscribe(() => {this.setState(mapStateToProps(store.getState()));});}componentWillUnmount() {this.unsubscribe();}render() {// 将接收到的mapStateToProps、mapDispatchToProps传入要返回的新组件中const stateObj = mapStateToProps(store.getState());const dispatchObj = mapDispatchToProps(store.dispatch);return (<WrapperComponent {...this.props} {...stateObj} {...dispatchObj} />);}}return NewComponent;};
}

二、目前的问题

import store from "../store";

从这行代码可以看到,目前的connect直接引用了上级目录的store,过于依赖目前既定的store,这样不利于复用。假设另一个项目的store所在位置不在上级目录中,则会出现问题。

三、优化上面的丐版connect

为了让所有人都能使用,我们应该把这种“写死”的做法换成让开发者自己传入一个store:

  1. 构建一个StoreContext,用于创建Store的上下文(src/hoc/StoreContext.js):

    import { createContext } from "react";export const StoreContext = createContext()
    
  2. 当我们在项目的index.js中引入connect时,引入并使用该上下文,让开发者手动传入当前的store(src/index.js):

    import React from "react";
    import ReactDOM from "react-dom/client";
    import { Provider } from "react-redux";
    import { StoreContext } from "./hoc";
    import App from "./App";
    import store from "./store";const root = ReactDOM.createRoot(document.getElementById("root"));
    root.render(// <React.StrictMode><Provider store={store}><StoreContext.Provider value={store}><App /></StoreContext.Provider></Provider>// </React.StrictMode>
    );
  3. 在connect中,通过 contextType 共享从 Provider 中传入的 store 变量,将原来直接引用的 store 替换成 this.context(hoc/connect.js):

    import { PureComponent } from "react";
    import { StoreContext } from "./StoreContext";/*** connect的参数:* 参数一: 函数* 参数二: 函数* 返回值: 函数*/
    export function connect(mapStateToProps, mapDispatchToProps) {// 返回一个高阶组件,本质也是函数return function (WrapperComponent) {class NewComponent extends PureComponent {constructor(props, context) {super(props);// 将接收到的mapStateToProps赋给state,用于部分值修改时的浅层比较、更新statethis.state = mapStateToProps(context.getState());}componentDidMount() {this.unsubscribe = this.context.subscribe(() => {this.setState(mapStateToProps(this.context.getState()));});}componentWillUnmount() {this.unsubscribe();}render() {// 将接收到的mapStateToProps、mapDispatchToProps传入要返回的新组件中const stateObj = mapStateToProps(this.context.getState());const dispatchObj = mapDispatchToProps(this.context.dispatch);return (<WrapperComponent {...this.props} {...stateObj} {...dispatchObj} />);}}// 在类组件中,通过 contextType 共享store变量NewComponent.contextType = StoreContextreturn NewComponent;};
    }
  4. 最后,在hoc中构建index.js,将优化后的connect导出(hoc/index.js):

    export { StoreContext } from "./StoreContext";
    export { connect } from "./connect";
  5. 在界面中使用现在优化后的connect:

    import React, { PureComponent } from "react";
    import { connect } from "../hoc";
    import { addNumber } from "../store/features/counter";export class About extends PureComponent {render() {const { counter } = this.props;return (<div><h2>About Counter: {counter}</h2></div>);}
    }const mapStateToProps = (state) => ({counter: state.counter.counter,
    });const mapDispatchToProps = (dispatch) => ({addNumber(num) {dispatch(addNumber(num));},
    });export default connect(mapStateToProps, mapDispatchToProps)(About);
  6. 查看效果,与之前效果一致:

在这里插入图片描述

http://www.shuangfujiaoyu.com/news/34300.html

相关文章:

  • 广东深圳网站建设微信商城运营淘宝指数网址
  • 网站推广方案书海外域名
  • 网站建设内部流程图semi是什么意思
  • 怀远县建设局门户网站关键词是什么意思
  • 百度网站排名优化软件google框架三件套
  • 有没有专门做数据分析的网站佛山百度关键词seo外包
  • 石家庄求职信息网东莞搜索网络优化
  • 南通网站建设 南大街seo关键词排名优化怎么样
  • wordpress标签页模板下载谷歌seo软件
  • 网站建设插件深圳网络推广代理
  • 怎样做网站的优化 排名seo站长查询
  • 湖北省建设厅政务公开网站免费的域名和网站
  • 江西建设工程招标投标网站google 网站推广
  • 微网站和手机网站的区别全国疫情高峰时间表最新
  • 跑wordpress配置西安seo建站
  • 东莞专业网站设计制作公司网络营销有哪些手段
  • 用vs2012做网站百度 指数
  • 有什么做服装的网站吗天津seo培训机构
  • 青岛企业建站岳阳网站设计
  • 沈阳做网站的公司排行内江seo
  • 重庆企业网站制作优化大师人工服务电话
  • 云南网站建设天软科技聚合搜索引擎接口
  • 崇文企业网站建设公司百度站长工具app
  • 疯狂影视seo营销推广多少钱
  • 做动画 的 网站有哪些关键词优化最好的方法
  • 网页设计类网站什么是网店推广
  • 室内设计去哪里学灰色词优化培训
  • 程序员知识网站需要多少钱色盲能治好吗
  • 无锡做网站多少钱百度爱采购客服电话
  • 家居企业网站建设平台百度搜索排名靠前