Flux的基本概念
Flux是一种架构思想或者说是设计模式,专门解决软件的结构问题。它跟MVC架构是同一类东西,但是更加简单和清晰。
FaceBook Flux是用来构建客户端Web应用的应该架构。他利用单向数据流的方式来组合React中的视图组件。它更像一个模式而不是一个正式的框架,开发者不需要太多的新代码就可以快速上手。
Redux
npm i redux --save //放在项目根目录中
Redux最主要的作用是用作状态的管理,即:集中式管理状态的javascript库。
两大核心:actions state
简言之,Redux用一个单独的常量状态树(state对象)保存这一整个应用的状态,这个对象不能直接被改变。当一些数据变化了,一个新的对象就会被创建(使用actions和reducers),这样就可以进行数据追踪,实现时光之旅。
Redux三大原则
- state以单一的对象存储在store中,是唯一的数据源,有且只有一个
- state是只读的只能通过action修改
- 使用纯函数reducer执行数据的更新
Redux执行流程(原理)
- React组件从store获取redux中的数据
- 当页面数据要进行修改的时候,我们通过dispatch提交actions到store
- store把actions提交reducers中执行对应的逻辑,修改state中的数据
- 更新后的state数据返回到store中,更新React组件页面上的数据
Redux的使用
安装Redux
cnpm i redux --save //放在项目根目录中
配置使用redux
- 在src目录创建一个store文件夹,用来存放redux数据
- 在store新建一个js文件index.js,在index.js中配置redux的内容
- 在index.js中导入createStore方法,创建redux数据的方法
- 创建reducers纯函数,纯函数有两个参数state 初始化的数据,actions修改state数据逻辑
- switch判断actions中提交type类型执行state修改,返回修改的结果
- createStore方法创建store对象,export default抛出对象的值
- 在使用redux的页面导入index.js文件即可
// 1.导入createStore方法
import { createStore } from "redux";
// 2.创建一个reducer纯函数的方法,state初始化数据,actions修改数据的行为
const reducer=function (state,actions){
//定义初始化的数据
if(!state){
state={
count:10
}
}
//定义actions的逻辑代码区域,处理逻辑的信息
switch(actions.type){
//调用执行+1的逻辑
case "PLUS":
return{
...state,
// count:state.count+1,
count:state.count+actions.payload,
}
case "MIN":
return{
...state,
count:state.count-1
}
default:{
return{
...state
}
}
}
}
//3.创建一个store的对象
const store=createStore(reducer)
// 4.抛出store的对象值
export {store};
Redux具体使用
在src中创建一个components文件夹,再在此文件夹中创建一个Home文件为Home.jsx
import React from 'react'
import {store} from "../../store"
export default function Home(props) {
// 获取redux数据
let {count}=store.getState()
console.log(count);
return (
<div>
<h3>
主页面
Redux:{count}
</h3>
<button onClick={()=>{store.dispatch({type:"PLUS",payload:2})}}>count++</button>
<button onClick={()=>{store.dispatch({type:"MIN"})}}>count-1</button>
</div>
)
}
然后再在index.js中写入(当数据刷新,但是页面不刷新的时候使用store.subscript)
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter } from 'react-router-dom';
import {store} from "./store"
const root = ReactDOM.createRoot(document.getElementById('root'));
store.subscribe(()=>{
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
})
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
reportWebVitals();
然后就可以看到一个此页面,上面的count去进行一个加2的操作
小试牛刀(案例:Demo)
还是一样的去操纵两个文件一个是我们的Home.jsx页面,另一个是store中的index.js文件
第一首先是我们的Home.jsx
import React from 'react'
import {store} from "../../store"
import { useRef } from 'react'
export default function Home(props) {
// 获取redux数据
let {count,list}=store.getState()
let nameinp=useRef(null)
let ageinp=useRef(null)
console.log(count);
const add=()=>{
console.log(nameinp.current.value,ageinp.current.value);
// 提交到redux中去
store.dispatch({type:"ADD",payload:{name:nameinp.current.value,age:ageinp.current.value}})
}
return (
<div>
{/* <h3>
主页面
Redux:{count}
</h3>
<button onClick={()=>{store.dispatch({type:"PLUS",payload:2})}}>count++</button>
<button onClick={()=>{store.dispatch({type:"MIN"})}}>count-1</button> */}
<hr/>
<div>
<input type="text" ref={nameinp} placeholder='请输入姓名'/><br/>
<input type="text" ref={ageinp} placeholder='请输入年龄'/><br/>
<button onClick={add}>添加</button>
</div>
<ul>
{list.map((item,index)=>{
return(
<li key={index}>{item.name}--{item.age}</li>
)
})}
</ul>
</div>
)
}
其次是我们的store文件夹中的index.js文件(其中有一个添加列表的注释即是我们的添加)