草庐IT

【React全家桶】Flux与Redux

糖^O^ 2023-04-14 原文

🎞️🎞️🎞️ 博主主页: 糖 -O-


👉👉👉 react专栏:react全家桶


🌹🌹🌹希望各位博主多多支持!!!

Flux与Redux


Flux 是一种架构思想,专门解决软件的结构问题。它跟MVC架构是同一类东西,但是更加简单和清晰。Flux存在多种实现(至少15种)

Facebook Flux是用来构建客户端Web应用的应用架构。它利用单向数据流的方式来组合React

中的视图组件。它更像一个模式而不是一个正式的框架,开发者不需要太多的新代码就可以快速的上手Flux。

Facebook Flux是用来构建客户端Web应用的应用架构。它利用单向数据流的方式来组合React

中的视图组件。它更像一个模式而不是一个正式的框架,开发者不需要太多的新代码就可以快速的上手Flux。

Redux最主要是用作应用状态的管理。简言之,Redux用一个单独的常量状态树(state对象)保存这一整个应用的状态,这个对象不能直接被改变。当一些数据变化了,一个新的对象就会被创建(使用actions和reducers),这样就可以进行数据追踪,实现时光旅行。

1. redux介绍及设计和使用的三大原则
  • 单一数据源

    整个应用的state被储存在一棵object tree中,并且这个object tree只存在于唯一 一个store中

  • State是只读的

    唯一改变state的方法就是触发action,action是一个用于描述已发生事件的普通对象.

  • 使用纯函数来执行修改

    描述action如何改变staet tree,需要编写reducers.

2. redux工作流

Redux工作流程:

  • View在redux中会派发action方法 action通过store的dispatch方法会派发给store

  • store接收action,连同之前的state,一起传递给reducer reducer返回新的数据给store

  • store去改变自己的state

3.redux原理解析
store 是通过 createStore创建出来的,
所以他的结构
export const createStore =
function(reducer, initialState) {

return {
dispatch, 用于action的分发,
改变store里面的state(currentState =
reducer(currentState,action)) ,并
在内部遍历subcribe注册的监听器
subscribe,注册listener,
store里面state发生改变后,执行该
listener
getState, 取store里面的
state

}
}

function createStore(reducer){
var list = [];
var state =reducer();
function subscribe(callback){
list.push(callback);
}
function dispatch(data){
state =
reducer(state,data);
for(var i in list){
list[i]();
}
}
function getState(){
return state;
}
return {
subscribe,
dispatch,
getState
}
}
4. reducer 扩展

如果不同的action所处理的属性之间没有联系,我们可以把 Reducer 函数拆分。
不同的函数负责处理不同属性,最终把它们合并成一个大的 Reducer 即可

import {combineReducers} from "redux";
const reducer = combineReducers({
a: functionA,
b: functionB,
c: functionC
})
访问:
(state)=>{
return {
kerwinstate:state.a (不同的命名空间)
}
}
5. redux中间件

在redux里,action仅仅是携带了数据的普通js对象,action creator返回的值是这个action类型的对象。
然后通过store.dispatch()进行分发。同步的情况下一切都很完美,但reducer无法处理异步的情况,那么我们就需要在action和reducer中间架起一座桥梁来处理异步

i. 中间件的由来与原理、机制

export default function thunkMiddleware({ dispatch, getState }) {
return next => action =>
typeof action === 'function' ?
action(dispatch, getState) :
next(action);
}

这段代码的意思是,中间件这个桥梁接受到的参数action,如果不是function则和过去一样直接执

行next方法(下一步处理),相当于中间件没有做任何事。如果action是function,则先执行action,

action的处理结束之后,再在action的内部调用dispatch。

ii. 常用异步中间件:

  • redux-thunk (store.dispatch参数可以是一个function)
import thunk from 'redux-thunk';
import {applyMiddleware} from "redux";
const store = createStore(fetchReducer, applyMiddleware(thunk));
const getComingSoon = ()=>{
//进行异步请求
return (dispatch,store)=>{
}
}
  • redux-promise (store.dispatch参数可以是一个promise对象)

import promiseMiddleware from 'redux-promise';

const store = createStore(fetchReducer, applyMiddleware(thunk,promiseMiddleware));

const getComingSoon = ()=>{

//进行异步请求

return axios.get(`****`).then(res=>{

return {

type:"cominglist",

info:res.data.data
}
})
}
6. Redux DevTools Extension

redux-devtools-extension 的使用

插件安装

$ npm install redux-devtools-extension -D

下载完成之后

  • 可以在浏览器工具栏右上角可以看到图标(当应用可以使用该工具时,图标变亮)
  • 在页面上右键可以看到 Redux DevTools 选项
  • 打开控制台,在菜单栏可以找到 Redux 菜单栏
import { createStore, compose} from 'redux'
import reducer from './reducer'
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const store = createStore(reducer, /* preloadedState, */ composeEnhancers())
export default store

有关【React全家桶】Flux与Redux的更多相关文章

  1. ruby-on-rails - Ruby 长时间运行的进程对队列事件使用react - 2

    我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby​​脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几

  2. ruby - 单个 EventMachine react 器中的多个服务器 - 2

    是否可以在单个事件机器中运行多个服务器?我的意思是,多个服务可以由一个客户端连接同时使用。例如,登录服务器对用户进行身份验证,然后用户可以同时使用聊天室和简单的游戏,例如带有单个客户端套接字的跳棋?或者我是否需要为每个服务使用多个事件机器react器? 最佳答案 我试过了,它正在工作:#!/usr/bin/envrubyrequire'eventmachine'moduleEchoServerdefpost_initputs"--someoneconnectedtotheechoserver!"enddefreceive_datad

  3. React通过classnames库添加类 - 2

    React添加Class的方式在vue中添加class是一件非常简单的事情:你可以通过传入一个对象,通过布尔值决定是否添加类:button:class="{active:isFlag,aaa:true}">按钮button>你也可以传入一个数组:h2:class="['aaa','bbb']">HelloVueh2>h2:class="[className1,className2]">HelloVueh2>甚至是对象和数组混合使用:h2:class="['aaa',{active:isFlag}]">HelloVueh2>而在React中就相对繁琐了,React在JSX给了我们开发者足够多的灵

  4. 如何使React Router V4路由与React Transition Group(低级API)一起使用 - 2

    从ReactRouterV3过渡到V4后,我再也无法使ReactTransition组低级API工作。React路由器的文档显示了与CSS动画相关的高级API的示例,这些示例与低水平的JS风味不起作用。任何人都设法或知道让这个工作?看答案已经一个月了,所以我想您找到了自己的出路,但可能会对他人有所帮助。我创建了这个:https://www.npmjs.com/package/reeact-router-v4-transition在我遇到同样的问题之后。它在开关组件中提供了一种过渡组。从将开关更改为TransitionSwitch的Appart,它不需要大幅度更改。我将在接下来的几天(可能是星期

  5. paddle nlp taskflow 全家桶 包括代码生成与AIGC图片生成 一起探索paddle nlp 开包即用的能力吧 - 2

    paddlenlp作为自然语言处理领域的全家桶,具有很多的不错的开箱即用的nlp能力。今天我们来一起看看基于paddlenlp中taskflow开箱即用的能力有哪些。第一步先升级aistudio中的paddlenlp保持最新版本。pipinstall-UpaddlenlpLookinginindexes:https://pypi.tuna.tsinghua.edu.cn/simpleRequirementalreadysatisfied:paddlenlpin/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages(2

  6. javascript - 使用 React-Router 在路由之间传递 props - 2

    是在React-Router(1.0.0-rc)url参数中的路由之间传递数据的唯一方法吗?我有一个组件A,它使用Historymixin,并且有一个事件处理程序,该事件处理程序发出服务器请求,然后调用that.history.pushState(null,'/B');以过渡到路由B由组件B处理。现在,我想将服务器返回的一些数据作为Prop(例如“登录成功”)传递给组件B,或者以某种方式影响B的状态,但我找不到任何说明这是可能的。有什么办法可以做到这一点,还是我需要将其作为url参数传递? 最佳答案 你有两个选择:将数据作为查询参数

  7. javascript - react : input validation - 2

    我最近开始使用React,我遇到了输入验证问题。例如,它只是通过指令在另一个框架中作为Angular.js实现。经过一番研究,我发现newforms库,看起来像是当前开箱即用的最佳解决方案。但它非常重,不确定当前是否支持它(最后一次更新是7个月前)。另一种方法是将事件从父表单发送到其子输入,并在每个子输入上调用验证方法。但我找不到每个人都试图发明自己的东西的最佳实践,因此你需要自己写一些东西。表单验证的最佳解决方案是什么?React架构/框架(Flux/Redux)是否提供任何解决方案?谢谢, 最佳答案 我最近在React中使用了一

  8. javascript - 在单击事件上运行 AJAX 调用 - 使用 React.js - 2

    我正在创建一个网络应用程序,该应用程序将根据用户点击的城市对OpenWeatherAPI进行AJAX调用以获取城市的天气数据。我的前端使用React,后端使用Node.js/Express-但我无法正确设置如何根据用户的点击进行API调用。如何重构我的代码以使其基于点击?这是我目前所拥有的(JSBIN:http://bit.ly/1WedsL2)——目前硬编码为“London”:vardata=[{name:"London"},{name:"Tokyo"},{name:"NYC"}];varMusicBox=React.createClass({render:function(){re

  9. javascript - 在 React Native 中查看组件层次结构 - 2

    调试React网站时,我可以使用ReactDeveloperTools查看组件层次结构:我如何在ReactNative中做同样的事情?rageshake菜单包含一个“检查器”,但它似乎只能让我通过点击它来检查单个元素-我看不到任何浏览完整组件层次结构的方法。 最佳答案 不幸的是,从react-native0.12版本开始,Devtools的“React”选项卡不再起作用。这是aknownissue.有一个quiteactivediscussiononGithub已经开放了一段时间,但还没有解决方案。更新Devtools“React”

  10. javascript - 在 React.JS 中禁用右键单击 - 2

    如何在ReactJS中禁用Canvas中的右键单击。这是我尝试过但仍然无效的方法:letCanvas={e.preventDefault();returnfalse;}}height={500}width={500}ref="canvas"/>;浏览器控制台中也会显示警告。Warning:Returningfalsefromaneventhandlerisdeprecatedandwillbeignoredinafuturerelease.Instead,manuallycalle.stopPropagation()ore.preventDefault(),asappropriate.

随机推荐