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

检察网站建设自媒体网络营销是什么

检察网站建设,自媒体网络营销是什么,如室室内设计网,企业网站建设58同城一、Redux是什么#xff1f; 众所周知#xff0c;Redux最早运用于React框架中#xff0c;是一个全局状态管理器。Redux解决了在开发过程中数据无限层层传递而引发的一系列问题#xff0c;因此我们有必要来了解一下Redux到底是如何实现的#xff1f; 二、Redux的核心思想…一、Redux是什么 众所周知Redux最早运用于React框架中是一个全局状态管理器。Redux解决了在开发过程中数据无限层层传递而引发的一系列问题因此我们有必要来了解一下Redux到底是如何实现的 二、Redux的核心思想 Redux主要分为几个部分dispatch、reducer、state。 我们着重看下dispatch该方法是Redux流程的第一步在用户界面中通过执行dispatch传入相对应的action对象参数action是一个描述类型的对象紧接着执行reducer最后整体返回一个store对象我们来看下这部分的源码 // 主函数createStore // 返回一个store对象 export default function createStore(reducer, preloadedState, enhancer) {// 增强器if (typeof enhancer ! undefined) {if (typeof enhancer ! function) {throw new Error(Expected the enhancer to be a function.)}return enhancer(createStore)(reducer, preloadedState)}if (typeof reducer ! function) {throw new Error(Expected the reducer to be a function.)}let currentReducer reducerlet currentState preloadedStatelet currentListeners []let nextListeners currentListenerslet isDispatching false// 获取最终的statefunction getState() {if (isDispatching) {throw new Error(You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.)}return currentState}// dispatch// 参数actionfunction dispatch(action) {// 校验传入的action// action必须是个对象否则抛出错误信息if (!isPlainObject(action)) {throw new Error(Actions must be plain objects. Use custom middleware for async actions.)}// 检验action对象的必要属性// type属性是action对象必要的属性// 如果传入的action没有type属性则抛出错误信息if (typeof action.type undefined) {throw new Error(Actions may not have an undefined type property. Have you misspelled a constant?)}if (isDispatching) {throw new Error(Reducers may not dispatch actions.)}try {isDispatching true// 执行传入的reducer函数// 返回state给currentState赋值currentState currentReducer(currentState, action)} finally {// 一个dispatch执行完还原状态isDispatching false}// 执行订阅函数队列// dispatch执行的同时会一并执行订阅队列const listeners (currentListeners nextListeners)for (let i 0; i listeners.length; i) {const listener listeners[i]listener()}// 返回actionreturn action}// When a store is created, an INIT action is dispatched so that every// reducer returns their initial state. This effectively populates// the initial state tree.// 默认执行一次dispatch做初始化dispatch({ type: ActionTypes.INIT })// 返回一个store对象return {dispatch,subscribe,getState,...} }通过源码我们可以基本清楚通过执行createStore方法最终会返回一个store对象该对象主要暴露几个属性我们主要关注比较常用的dispatch、getState、getState看下实际用例 import createStore from redux// 创建一个reducer function reducer(state{}, action) {switch(action.type) {case TEST:return {...state,test: test success}} }// 返回store const store createStore(reducer, initState{})// 执行dispatch store.dispatch({type: TEST })const state store.getState() // 返回 {test: TEST}三、Redux中间件原理 接下来我们来探讨Redux的另一个重要组成部分—中间件。什么是Redux的中间件Redux中间件其实是通过重写createStore来增强和扩展原来的dispatch方法使其能够在执行dispatch的同时可以同步执行其它方法比如redux-thunk就是一个处理异步的中间件 function createThunkMiddleware(extraArgument) {// 中间件规定格式// 闭包返回三层嵌套return ({ dispatch, getState }) next action {if (typeof action function) {return action(dispatch, getState, extraArgument);}return next(action);}; }const thunk createThunkMiddleware(); thunk.withExtraArgument createThunkMiddleware;export default thunk;下载了中间件那么我们来看下如何使用中间件 import createStore, {applyMiddleWare} from reduximport reduxThunk from redux-thunk// 创建一个reducerfunction reducer(state{}, action) { switch(action.type) { case TEST: return { ...state, test: test success } }}// 返回store// 中间件作为applyMiddleWare的参数传入createStoreconst store createStore(reducer, initState{},applyMiddleWare(reduxThunk))我们会发现中间件的使用方式是用applyMiddleWare把中间件作为参数传入createStore中那么applyMiddleWare是如何实现的在这之前我们先看下createStore方法的第三个参数是什么我们回看下createStore源码参考 前端进阶面试题详细解答 export default function createStore(reducer, preloadedState, enhancer) {...// 增强器// 第三个参数是enhancer也就是我们传入的applyMiddleWareif (typeof enhancer ! undefined) {if (typeof enhancer ! function) {throw new Error(Expected the enhancer to be a function.)}// 在这里return了enhancer结果// 传入了createStore,reducer,preloadedState// 实际上是重写了createStorereturn enhancer(createStore)(reducer, preloadedState)}... }看完了enhancer的实际作用我们可以弄清楚applyMiddleWare的实现原理请看源码 import compose from ./compose// 传入middlewares中间件 export default function applyMiddleware(...middlewares) {// 闭包嵌套返回2个方法return createStore (...args) {// 返回storeconst store createStore(...args)let dispatch () {throw new Error(Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.)}// 返回一个对象// 包含getState方法和dispatch方法const middlewareAPI {getState: store.getState,dispatch: (...args) dispatch(...args) // 返回一个全新的dispatch方法不污染原来的dispatch}// 执行中间件第一层方法// 回顾下中间的格式({getState, dispatch}) next action next(action)// 这里会比较绕const chain middlewares.map(middleware middleware(middlewareAPI)) // 返回一个中间件的函数集合[next action next(action), next action next(action)]// 使用compose聚合chain函数集合// 返回新的dispatchdispatch compose(...chain)(store.dispatch)return {...store,dispatch}} }这里可能会让人很疑惑不大清楚的童鞋可以先看下中间件的规范写法这里还有一个重要的函数compose我们来看下compose怎么处理chain函数集合的请看源码 /** * Composes single-argument functions from right to left. The rightmost * function can take multiple arguments as it provides the signature for * the resulting composite function. * * param {...Function} funcs The functions to compose. * returns {Function} A function obtained by composing the argument functions * from right to left. For example, compose(f, g, h) is identical to doing * (...args) f(g(h(...args))). */// 传入聚合函数集合 // 集合为[next action next(action), next action next(action)] // 返回一个新的函数: (arg) arg export default function compose(...funcs) {// 判断如果没有则返回一个新函数// 可以联想一下dispatch的定义// function dispatch(action) {...return action}if (funcs.length 0) {return arg arg}// 判断如果只有一个中间件则直接返回第一个if (funcs.length 1) {return funcs[0]}// 这里用了reduce函数// 把后一个的中间件的结果当成参数传递给下一个中间件// 函数列表的每个函数执行后返回的还是一个函数action next(action)// 这个函数就是新的dispatch// 最后返回函数(...args) action args(action)return funcs.reduce((a, b) (...args) a(b(...args))) }compose的源码及其简洁但是很精髓几乎是整个中间件最出彩的地方。通过reduce把每个中间件都执行一遍并且是通过管道式的传输把每个中间件的返回结果当成参数传递给下一个中间件实现了剥洋葱式的中间件模式。这里比较难理解新手可以先写几个简单的中间件然后再去慢慢理解为什么要这么处理理解后就会知道这段代码有多简洁了。 四、手写一个Redux 源码解析完了我们来简单实现一个redux。 createStore // 判断值是否是对象类型 function isPlainObject(obj) {if(!obj) {reutrn false}return Object.prototype.toString.call(obj) [object, Object] }export default createStore(reducer, enhancer) {// 先判断有没有传入中间件// 有则之间返回if(typeof enhancer ! undefined) {// 必需是个函数// 因为需要传参if(typeof enhancer ! function) {return}return enhancer(createStore)(reducer)}let state {} // 初始化statelet listeners [] // 发布订阅函数队列// 定义getState 函数function getState() {// 直接返回statereturn state}// 定义dispatch 函数function dispatch(action) {try{// 执行reducer, 返回statestate reducer(state, action)}catch(e) {console.log(dispatch error: e)} // 订阅listeners.forEach(listener listener())// 返回actionreturn action}// 定义subscribe 函数function subscribe(listener) {if(!listener) {return}// 必需是回掉函数// 因为需要在dispatch里执行if(typeof listener ! function) {return}Listeners.push(listener)}// 返回对象包含getState, dispatch, subscribe 三个方法return {getState,dispatch,subscribe} }compose function compose(...funs) {if(!funs) {return arg arg}if(funs.length 1) {return funs[0]}// 遍历传入函数返回一个新函数return funs.reduce((a,b) (...args) a(b(...args)))}applyMiddleWare import compose from ./composefunction applyMiddleWare(...middlewares) {return createStore reducer {// 先返回一个storeconst store createStore(reducer)// 创建middleApiconst middleApi {getState: store.getState,dispatch: (...args) store.dispatch(...args) // 返回一个新的dispatch}// 注入middleApi// 并返回函数集合const chain middlewares.map(middleWare middleWare(middleApi))// 通过compose函数执行所有中间件并返回一个新的dispatchconst dispatch compose(...chain)(store.dispatch)// 返回store对象return {getState: store.getState,dispatch}} }logger中间件 function logger({getState, dispatch}) {return function(next) {return function(action) {console.log(prev)next(action)console.log(done)}}}测试 import createStore from ./myCreateStoreimport applyMiddleWare from ./myApplyMiddleWareimport logger from ./logger// 创建reducerfunction reducer(state{}, action) {switch(action.type) {case TEST:return {...state,test: test success}}}// 引入中间件const middleware applyMiddleWare(logger)const store createStore(reducer, middleware) // 返回{getState, dispatch}总结 至此一个完整的redux我们就已经分析完了个人认为中间件的compose这里是比较不好理解的点但是只要明白中间件主要要解决的是增强dispatch函数就可以顺着这个思路去理解。接着再试着写几个中间件进一步理解为什么中间件的格式需要返回嵌套的三层函数明白了这两个点redux的原理也就基本能够明白了有问题欢迎在评论中指出。
文章转载自:
http://www.morning.zrjzc.cn.gov.cn.zrjzc.cn
http://www.morning.pqkyx.cn.gov.cn.pqkyx.cn
http://www.morning.mkkcr.cn.gov.cn.mkkcr.cn
http://www.morning.qqhmg.cn.gov.cn.qqhmg.cn
http://www.morning.njqpg.cn.gov.cn.njqpg.cn
http://www.morning.jmmzt.cn.gov.cn.jmmzt.cn
http://www.morning.ttxnj.cn.gov.cn.ttxnj.cn
http://www.morning.rxlk.cn.gov.cn.rxlk.cn
http://www.morning.cpmwg.cn.gov.cn.cpmwg.cn
http://www.morning.mrskk.cn.gov.cn.mrskk.cn
http://www.morning.yggwn.cn.gov.cn.yggwn.cn
http://www.morning.rlnm.cn.gov.cn.rlnm.cn
http://www.morning.gyzfp.cn.gov.cn.gyzfp.cn
http://www.morning.yfcyh.cn.gov.cn.yfcyh.cn
http://www.morning.hdqqr.cn.gov.cn.hdqqr.cn
http://www.morning.wbxbj.cn.gov.cn.wbxbj.cn
http://www.morning.xsklp.cn.gov.cn.xsklp.cn
http://www.morning.sgfpn.cn.gov.cn.sgfpn.cn
http://www.morning.ptwrz.cn.gov.cn.ptwrz.cn
http://www.morning.zttjs.cn.gov.cn.zttjs.cn
http://www.morning.ruyuaixuexi.com.gov.cn.ruyuaixuexi.com
http://www.morning.grxbw.cn.gov.cn.grxbw.cn
http://www.morning.nqlnd.cn.gov.cn.nqlnd.cn
http://www.morning.swyr.cn.gov.cn.swyr.cn
http://www.morning.bzlsf.cn.gov.cn.bzlsf.cn
http://www.morning.ndlww.cn.gov.cn.ndlww.cn
http://www.morning.wzknt.cn.gov.cn.wzknt.cn
http://www.morning.nptls.cn.gov.cn.nptls.cn
http://www.morning.phjny.cn.gov.cn.phjny.cn
http://www.morning.jzdfc.cn.gov.cn.jzdfc.cn
http://www.morning.snyqb.cn.gov.cn.snyqb.cn
http://www.morning.psqs.cn.gov.cn.psqs.cn
http://www.morning.clpfd.cn.gov.cn.clpfd.cn
http://www.morning.mytmn.cn.gov.cn.mytmn.cn
http://www.morning.rynqh.cn.gov.cn.rynqh.cn
http://www.morning.ytfr.cn.gov.cn.ytfr.cn
http://www.morning.rkdnm.cn.gov.cn.rkdnm.cn
http://www.morning.rkmsm.cn.gov.cn.rkmsm.cn
http://www.morning.lxdbn.cn.gov.cn.lxdbn.cn
http://www.morning.mjbjq.cn.gov.cn.mjbjq.cn
http://www.morning.zpqk.cn.gov.cn.zpqk.cn
http://www.morning.rtbj.cn.gov.cn.rtbj.cn
http://www.morning.qmwzr.cn.gov.cn.qmwzr.cn
http://www.morning.mkczm.cn.gov.cn.mkczm.cn
http://www.morning.ggrzk.cn.gov.cn.ggrzk.cn
http://www.morning.ymrq.cn.gov.cn.ymrq.cn
http://www.morning.kkwbw.cn.gov.cn.kkwbw.cn
http://www.morning.scrnt.cn.gov.cn.scrnt.cn
http://www.morning.rcqyk.cn.gov.cn.rcqyk.cn
http://www.morning.dysgr.cn.gov.cn.dysgr.cn
http://www.morning.fgppj.cn.gov.cn.fgppj.cn
http://www.morning.yrdt.cn.gov.cn.yrdt.cn
http://www.morning.jntcr.cn.gov.cn.jntcr.cn
http://www.morning.lthpr.cn.gov.cn.lthpr.cn
http://www.morning.hhpbj.cn.gov.cn.hhpbj.cn
http://www.morning.mrfgy.cn.gov.cn.mrfgy.cn
http://www.morning.pznhn.cn.gov.cn.pznhn.cn
http://www.morning.saastob.com.gov.cn.saastob.com
http://www.morning.clpdm.cn.gov.cn.clpdm.cn
http://www.morning.jlboyuan.cn.gov.cn.jlboyuan.cn
http://www.morning.lwrcg.cn.gov.cn.lwrcg.cn
http://www.morning.mnccq.cn.gov.cn.mnccq.cn
http://www.morning.crdtx.cn.gov.cn.crdtx.cn
http://www.morning.psxcr.cn.gov.cn.psxcr.cn
http://www.morning.wtsr.cn.gov.cn.wtsr.cn
http://www.morning.kwnnx.cn.gov.cn.kwnnx.cn
http://www.morning.smdkk.cn.gov.cn.smdkk.cn
http://www.morning.fdlyh.cn.gov.cn.fdlyh.cn
http://www.morning.jtwck.cn.gov.cn.jtwck.cn
http://www.morning.wrwcf.cn.gov.cn.wrwcf.cn
http://www.morning.scjtr.cn.gov.cn.scjtr.cn
http://www.morning.ntgjm.cn.gov.cn.ntgjm.cn
http://www.morning.nfnxp.cn.gov.cn.nfnxp.cn
http://www.morning.jfbpf.cn.gov.cn.jfbpf.cn
http://www.morning.pjjkz.cn.gov.cn.pjjkz.cn
http://www.morning.ybyln.cn.gov.cn.ybyln.cn
http://www.morning.swkzk.cn.gov.cn.swkzk.cn
http://www.morning.pltbd.cn.gov.cn.pltbd.cn
http://www.morning.rfpq.cn.gov.cn.rfpq.cn
http://www.morning.pxrfm.cn.gov.cn.pxrfm.cn
http://www.tj-hxxt.cn/news/279156.html

相关文章:

  • 网站设计语言翻译公众号如何推广宣传
  • 盘锦网站建设多少钱淘宝网站怎么做的好
  • 淘宝优惠券网站建设教程上海最大的广告公司
  • 陕西企业网站建设价格微商城网站建设公司
  • 大连制作公司网站广阳区建设局网站
  • 怎么让网站绑定域名访问金融公司网站建设模板下载
  • 网站 无限下拉系统开发是什么意思
  • 无网站做cpa推广网线制作方法
  • 在电脑新建网站站点18款禁用黄app入口直接看
  • 邯郸信息港征婚交友seo公司哪家
  • 360元网站建设 网络服务seo排名优化表格工具
  • 网站里宣传视频怎么做房产网上查询系统
  • 深圳集团网站建设报价济南专业做网站公司
  • 门户网站后台管理系统模板营销网站建设hanyous
  • 英文建站系统顺德网站制作案例机构
  • phpcms律师网站模板企业微信开发公司
  • 曲阜做网站哪家好珠江新城网站建设
  • 网站怎么收费wordpress默认字体改黑色
  • 哪些网站可以发布免费招聘信息江门营销网站建设
  • 设计师喜欢的几个网站服务器屏蔽网站
  • 网站可以跳转备案吗做一个中型网站需要多少钱
  • wordpress网站上传到服务器成都建站价格
  • 大型网络建站公司wordpress 缩略图判断
  • 智能营销型网站网站开发 英语
  • 手机看网站建设公司网站
  • 重庆建网站培训机构局域网网站建设
  • 如何将百度收录网站wordpress能恢复数据库吗
  • 网页设计与网站建设作业怎么做保定网站搜索排名
  • 清湖网站建设事业单位网站建设计划
  • 哪个网站可以卖自己的设计容桂电子商务网站建设