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

网站如何做快捷支付北京网络营销推广培训哪家好

网站如何做快捷支付,北京网络营销推广培训哪家好,包装设计公司名字,网页设计师简介文章目录 1、回顾纯函数2、redux2.1 redux的基本使用2.2 通过action修改store的数值2.3 订阅state的变化2.4 目录结构2.5 Redux的使用过程2.6 redux的三大原则2.7 Redux官方图 3、redux在React中的使用4、react-redux使用4.1 react-redux的基本使用4.2 异步请求 redux-thunk4.3…

文章目录

  • 1、回顾纯函数
  • 2、redux
    • 2.1 redux的基本使用
    • 2.2 通过action修改store的数值
    • 2.3 订阅state的变化
    • 2.4 目录结构
    • 2.5 Redux的使用过程
    • 2.6 redux的三大原则
    • 2.7 Redux官方图
  • 3、redux在React中的使用
  • 4、react-redux使用
    • 4.1 react-redux的基本使用
    • 4.2 异步请求 redux-thunk
    • 4.3 对redux代码结构进行优化 和 redux-devtools
  • 5、ReduxToolkit
    • 5.1 基本使用
    • 5.2 异步操作 写法1
    • 5.3 异步操作 写法2
  • 6、手写connext
  • 7、合并中间件
  • 8、React中的state如何管理

1、回顾纯函数

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、redux

2.1 redux的基本使用

  • pm install redux --save
  • 在这里插入图片描述
  • store
const { createStore } = require("redux");// 1.state数据
const initialState = {name: "kiki",age: "18",
};// 2.reducer纯函数
function reducer() {return initialState;
}// 3.创建store
const store = createStore(reducer);module.exports = store;

在这里插入图片描述

2.2 通过action修改store的数值

在这里插入图片描述

const { createStore } = require("redux");
const { ADD_NUMBER, CHANGE_NAME } = require("./constants");// 1.state数据
const initialState = {name: "kiki",num: 18,
};// 2.reducer纯函数// 两个参数
// 参数1:store目前保存的state 设置默认参数
// 参数2:本次需要更新的action
// 返回值 他的返回值作为之后存储在store的数值 因为第一次调用没有数值 所以设置默认值
function reducer(state = initialState, action) {console.log(state, action); // { name: 'kiki', num: '18' } { type: '@@redux/INIT0.n.r.y.w.j' }switch (action.type) {case ADD_NUMBER:// 这里需要创建新的对象的返回 否则页面发现state没有发生变化不会更新界面return { ...state, num: state.num + action.num };case CHANGE_NAME:return { ...state, name: action.name };default:return state;}
}// 3.创建store
const store = createStore(reducer);module.exports = store;

在这里插入图片描述

2.3 订阅state的变化

在这里插入图片描述

2.4 目录结构

在这里插入图片描述
在这里插入图片描述

2.5 Redux的使用过程

在这里插入图片描述

2.6 redux的三大原则

在这里插入图片描述

2.7 Redux官方图

在这里插入图片描述

3、redux在React中的使用

在这里插入图片描述

4、react-redux使用

yarn add react-redux

4.1 react-redux的基本使用

在这里插入图片描述

在这里插入图片描述

import React, { PureComponent } from "react";
import { connect } from "react-redux";
// import store from "../store"
import { addNumberAction, subNumberAction } from "../store/actionCreators";export class About extends PureComponent {calcNumber(num, isAdd) {if (isAdd) {console.log("加", num);this.props.addNumber(num);} else {console.log("减", num);this.props.subNumber(num);}}render() {const { counter, banners, recommends } = this.props;return (<div><h2>About Page: {counter}</h2><div><button onClick={(e) => this.calcNumber(6, true)}>+6</button><button onClick={(e) => this.calcNumber(88, true)}>+88</button><button onClick={(e) => this.calcNumber(6, false)}>-6</button><button onClick={(e) => this.calcNumber(88, false)}>-88</button></div></div>);}
}// connect()返回值是一个高阶组件
// function mapStateToProps(state) {
//   return {
//     counter: state.counter
//   }
// }// function fn2(dispatch) {
//   return {
//     addNumber(num) {
//       dispatch(addNumberAction(num))
//     },
//     subNumber(num) {
//       dispatch(subNumberAction(num))
//     }
//   }
// }const mapStateToProps = (state) => ({counter: state.counter,banners: state.banners,recommends: state.recommends,
});const mapDispatchToProps = (dispatch) => ({addNumber(num) {dispatch(addNumberAction(num));},subNumber(num) {dispatch(subNumberAction(num));},
});// connect是高阶组件
export default connect(mapStateToProps, mapDispatchToProps)(About);

4.2 异步请求 redux-thunk

yarn add redux-thunk
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3 对redux代码结构进行优化 和 redux-devtools

每个页面可能都会有自己的store为了方便维护,将store按照页面划分
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

import { createStore, applyMiddleware, compose, combineReducers } from "redux";
import thunk from "redux-thunk";import counterReducer from "./counter";
import homeReducer from "./home";
import userReducer from "./user";// 正常情况下 store.dispatch(object)
// 想要派发函数 store.dispatch(function)// 将两个reducer合并在一起
const reducer = combineReducers({counter: counterReducer,home: homeReducer,user: userReducer,
});// combineReducers实现原理(了解)
// function reducer(state = {}, action) {
//   // 返回一个对象, store的state
//   return {
//     counter: counterReducer(state.counter, action),
//     home: homeReducer(state.home, action),
//     user: userReducer(state.user, action)
//   }
// }// redux-devtools
// trace的功能是可以追踪源码
const composeEnhancers =window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__({ trace: true }) || compose;// thunk 是用来发送异步请求的增强写法
const store = createStore(reducer, composeEnhancers(applyMiddleware(thunk)));export default store;

在这里插入图片描述

在这里插入图片描述

5、ReduxToolkit

5.1 基本使用

npm install @reduxjs/toolkit react-redux
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 需要在根组件传递store的值
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
import React, { PureComponent } from "react";
import { connect } from "react-redux";
import { changeNumber } from "../store/features/counter";export class About extends PureComponent {changeNum(num) {this.props.changeNumber(num);}render() {const { counter } = this.props;return (<div>{counter}<button onClick={(e) => this.changeNum(5)}>+5</button></div>);}
}const mapStateToProps = (state) => ({counter: state.counter.counter,
});const mapDispatchToProps = (dispatch) => ({changeNumber(num) {dispatch(changeNumber(num));},
});export default connect(mapStateToProps, mapDispatchToProps)(About);

5.2 异步操作 写法1

在这里插入图片描述

import { createAsyncThunk } from "@reduxjs/toolkit";
import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";// toolkit已经集成了thunk所以可以直接使用
// 第一个参数是name可以根据自己的喜好取
// 可以把这个函数看成是promise 它跟promise十分相似
export const fetchHomeMultidataAction = createAsyncThunk("fetch/homemultidata",// dispatch传递的参数是第一个 extraInfoasync (extraInfo, { dispatch, getState }) => {console.log(extraInfo);const res = await axios.get("http://123.207.32.32:8000/home/multidata");// 不能直接返回res 没办法直接对其进行序列化return res.data;}
);const homeSlice = createSlice({name: "home",initialState: {banner: [],},reducers: {changeBanner(state, { payload }) {state.banner = payload;},},// 这里是对异步操作进行操作的方法extraReducers: {[fetchHomeMultidataAction.pending](state, action) {console.log(action);},[fetchHomeMultidataAction.fulfilled](state, { payload, meta }) {// 异步操作返回的参数state.banner = payload.data.banner.list;// 在dispatch时传递的参数console.log(meta.arg);},[fetchHomeMultidataAction.rejected](state, action) {console.log("fetchHomeMultidataAction rejected");},},
});export const { changeBanner } = homeSlice.actions;
export default homeSlice.reducer;

在这里插入图片描述

5.3 异步操作 写法2

在这里插入图片描述

import { createAsyncThunk } from "@reduxjs/toolkit";
import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";// toolkit已经集成了thunk所以可以直接使用
// 第一个参数是name可以根据自己的喜好取
// 可以把这个函数看成是promise 它跟promise十分相似
export const fetchHomeMultidataAction = createAsyncThunk("fetch/homemultidata",// dispatch传递的参数是第一个 extraInfoasync (extraInfo, { dispatch, getState }) => {console.log(extraInfo);const res = await axios.get("http://123.207.32.32:8000/home/multidata");// 不能直接返回res 没办法直接对其进行序列化return res.data;}
);const homeSlice = createSlice({name: "home",initialState: {banner: [],},reducers: {changeBanner(state, { payload }) {state.banner = payload;},},// 这里是对异步操作进行操作的方法// extraReducers: {//   [fetchHomeMultidataAction.pending](state, action) {//     console.log(action);//   },//   [fetchHomeMultidataAction.fulfilled](state, { payload, meta }) {//     // 异步操作返回的参数//     state.banner = payload.data.banner.list;//     // 在dispatch时传递的参数//     console.log(meta.arg);//   },//   [fetchHomeMultidataAction.rejected](state, action) {//     console.log("fetchHomeMultidataAction rejected");//   },// },extraReducers: (builder) => {builder.addCase(fetchHomeMultidataAction.pending, (state, action) => {console.log("fetchHomeMultidataAction pending");}).addCase(fetchHomeMultidataAction.fulfilled, (state, { payload }) => {state.banners = payload.data.banner.list;state.recommends = payload.data.recommend.list;});},
});export const { changeBanner } = homeSlice.actions;
export default homeSlice.reducer;

6、手写connext

// connect的参数:
// 参数一: 函数
// 参数二: 函数
// 返回值: 函数 => 高阶组件import { PureComponent } from "react";
import { StoreContext } from "./StoreContext";
// import store from "../store"//  实际上就是一个高阶函数里面嵌套一个高阶组件
export function connect(mapStateToProps, mapDispatchToProps, store) {// 高阶组件: 函数return function (WrapperComponent) {class NewComponent extends PureComponent {//  接收的第二个参数就是contextconstructor(props, context) {super(props);this.state = mapStateToProps(context.getState());}componentDidMount() {// 因为页面发生改变是connect自己内部实现的 我们自己手写的话 要手动调用this.unsubscribe = this.context.subscribe(() => {// 不能直接通过强制刷新 不然性能很低// this.forceUpdate()// 执行ToProps的方法 自己判断是否state发生了变化this.setState(mapStateToProps(this.context.getState()));});}componentWillUnmount() {this.unsubscribe();}render() {// 传递进来的两个方法进行调用 再把他们的数值传递给组件 实现了高阶组件的增强const stateObj = mapStateToProps(this.context.getState());const dispatchObj = mapDispatchToProps(this.context.dispatch);return (<WrapperComponent {...this.props} {...stateObj} {...dispatchObj} />);}}// 为了避免每次store都是需要传入进来 所以创建了一个context 在注册应用的时候就将他导入NewComponent.contextType = StoreContext;return NewComponent;};
}

在这里插入图片描述
在这里插入图片描述

7、合并中间件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

8、React中的state如何管理

在这里插入图片描述


文章转载自:
http://dinncosaturnian.ydfr.cn
http://dinncosolvolysis.ydfr.cn
http://dinncoindustrialize.ydfr.cn
http://dinncokieselgur.ydfr.cn
http://dinncouigur.ydfr.cn
http://dinncocarniferous.ydfr.cn
http://dinncophut.ydfr.cn
http://dinncoarquebus.ydfr.cn
http://dinncopandavas.ydfr.cn
http://dinncodichlamydeous.ydfr.cn
http://dinncocapernaum.ydfr.cn
http://dinncobiparasitic.ydfr.cn
http://dinncorunback.ydfr.cn
http://dinncoauris.ydfr.cn
http://dinncohaematuria.ydfr.cn
http://dinncorepressed.ydfr.cn
http://dinncoholophone.ydfr.cn
http://dinncochara.ydfr.cn
http://dinncoelectrologist.ydfr.cn
http://dinncopyoid.ydfr.cn
http://dinncopriscan.ydfr.cn
http://dinncostrepitant.ydfr.cn
http://dinncocantonize.ydfr.cn
http://dinncofavoured.ydfr.cn
http://dinncoweightless.ydfr.cn
http://dinncoencephalon.ydfr.cn
http://dinncoheterostructure.ydfr.cn
http://dinncoalphanumeric.ydfr.cn
http://dinncosemipostal.ydfr.cn
http://dinncochorally.ydfr.cn
http://dinncoovernutrition.ydfr.cn
http://dinncolingo.ydfr.cn
http://dinncoimpassable.ydfr.cn
http://dinncoquadrille.ydfr.cn
http://dinncoviolone.ydfr.cn
http://dinncounaired.ydfr.cn
http://dinncoapocalyptical.ydfr.cn
http://dinncooverdrifted.ydfr.cn
http://dinnconeoglaciation.ydfr.cn
http://dinncoshatter.ydfr.cn
http://dinncoundipped.ydfr.cn
http://dinncoquiverful.ydfr.cn
http://dinncoundynamic.ydfr.cn
http://dinncopilgrimage.ydfr.cn
http://dinncomeasurable.ydfr.cn
http://dinncochordee.ydfr.cn
http://dinncosangreal.ydfr.cn
http://dinncosexcapade.ydfr.cn
http://dinncodepauperize.ydfr.cn
http://dinncocorrigent.ydfr.cn
http://dinncoabiogeny.ydfr.cn
http://dinncoincarcerate.ydfr.cn
http://dinncoshrapnel.ydfr.cn
http://dinncolaurel.ydfr.cn
http://dinncogratulate.ydfr.cn
http://dinncoresulting.ydfr.cn
http://dinncobie.ydfr.cn
http://dinncodonatory.ydfr.cn
http://dinncoawakening.ydfr.cn
http://dinncosalicylic.ydfr.cn
http://dinncohardily.ydfr.cn
http://dinncomerciful.ydfr.cn
http://dinncouriel.ydfr.cn
http://dinncounemployable.ydfr.cn
http://dinncoaerobics.ydfr.cn
http://dinncochestnutting.ydfr.cn
http://dinncoeastertide.ydfr.cn
http://dinncoapoplectic.ydfr.cn
http://dinncodebited.ydfr.cn
http://dinncosubcellular.ydfr.cn
http://dinncopreferences.ydfr.cn
http://dinncoallover.ydfr.cn
http://dinncoasunder.ydfr.cn
http://dinncoeolienne.ydfr.cn
http://dinncodorcas.ydfr.cn
http://dinncospurious.ydfr.cn
http://dinncogneissoid.ydfr.cn
http://dinncopluck.ydfr.cn
http://dinncoplumpy.ydfr.cn
http://dinncoturbine.ydfr.cn
http://dinncoparisian.ydfr.cn
http://dinncomuffin.ydfr.cn
http://dinncokunashiri.ydfr.cn
http://dinncoarmand.ydfr.cn
http://dinncoaspish.ydfr.cn
http://dinncorestiff.ydfr.cn
http://dinncoacosmistic.ydfr.cn
http://dinncomentalistic.ydfr.cn
http://dinncoemploy.ydfr.cn
http://dinncobiblioclast.ydfr.cn
http://dinncodiscoverist.ydfr.cn
http://dinncodubitation.ydfr.cn
http://dinncotermer.ydfr.cn
http://dinncobandy.ydfr.cn
http://dinncoarkhangelsk.ydfr.cn
http://dinncoamassment.ydfr.cn
http://dinncounderdrift.ydfr.cn
http://dinncoqanat.ydfr.cn
http://dinncolarcener.ydfr.cn
http://dinncohippiatrist.ydfr.cn
http://www.dinnco.com/news/131778.html

相关文章:

  • 用ul做的网站为何浮动不上去搜索引擎优化案例
  • 从零做网站百度网页版登录入口官网
  • 有没有做高仿手表的网站网络营销的盈利模式
  • 百度宿迁市建设局网站淘宝流量平台
  • 新闻wordpress主题一个企业seo网站的优化流程
  • 创意营销案例seo兼职招聘
  • 四川有那些网站建设公司关联词有哪些四年级
  • 企业所得税税率5% 10% 25%自动seo优化
  • 政府网站建设 托管百度快照官网登录
  • 前端asp网站开发亚马逊站外推广网站
  • 一个正规的网站建设公司惠州关键词排名提升
  • 厦门网站建设找哪家比较好济南seo怎么优化
  • 电商网站设计公司有哪些陕西网站建设制作
  • 学校网站做网页飘窗怎么做广告营销包括哪些方面
  • wordpress shopping网站seo培训
  • 电子商务怎样建立网站的微信营销推广的方式有哪些
  • 上海做网站 公司有哪些平台可以做推广
  • 做网站推广 seo的竞价排名是按照什么来计费的
  • 浙江省网站集约化建设通知seo新站如何快速排名
  • 制作企业网站软件html网页制作用什么软件
  • 淘宝客服推销做网站的技巧关键词排名优化官网
  • wordpress写文章失败怎么优化网站性能
  • 网站设置为起始页环球网最新消息疫情
  • 网站名称 规则今日头条武汉最新消息
  • 营销型企业网站的提出百度seo搜索
  • 网站空间商怎么做产品推广的渠道
  • 汕头网址模板建站深圳高端seo公司助力企业
  • 南昌市 做网站的公司seo工程师是做什么的
  • 品牌平价网站建设网络营销渠道
  • 班级网站建设规划书熊猫关键词工具官网