flux——redux
#######################################################
可人不是断气的时候才真的死了。
有人说人会死三次,
第一次是他断气的时候 ,从生物学上他死了;
第二次是他下葬的时候,人们来参加他的葬礼,怀念他的一生,然后在社会上他死了,不再会有他的位置;
第三次是最后一个记得他的人把他忘记的时候,那时候他才真正的死了。
#############################################################################
flux是一种架构思想,专门解决软件的结构问题,让组件之间通信更方便,一共有15中实现模式
facebook flux是对于flux的一种实现,
redux是基于flux模型的一种实现,
他们都不是为react量身定做的,
react-redux是为react量身定做的
#############################################################################
reudx工作流程(也是flux流程的思想):
在组件(component)中,我们通过一个按钮点击或者ajax请求回来东西等,我们要发送一个action,这个action中包含了这个action的类型和真正要发布的数据,一起发送到store中,但是store无法直接处理,需要交给reducer来进行状态的修改,reducer修改状态有一个原则——就是纯函数,reducer不会直接修改老状态,它是接收老状态之后进行二次加工,然后返回一个新的状态,这个过程并不涉及老状态的修改,reducer返回新状态之后,store就会自动的通知在这里面订阅的组件,订阅的组件就会收到这个更新的状态,然后就会自动的更新要修改的值
------------------------------获取状态subscribe---------------------------
1 import React ,{Component} from "react"; 2 import store from "../../store"; 3 class Navbar extends Component{ 4 5 constructor(props) { 6 super(props); 7 8 this.state = { 9 title:store.getState().titlereducer 10 }; 11 } 12 componentWillMount(){ 13 14 //订阅消息 15 16 store.subscribe(()=>{ 17 console.log("状态修改了",store.getState()) 18 this.setState({ 19 title:store.getState().titlereducer 20 }) 21 }) 22 23 } 24 25 render(){ 26 return <div> 27 Navbar--{this.state.title} 28 </div> 29 } 30 } 31 32 export default Navbar;
---------------------------发送状态dispatch---------------------------------
1 import React ,{Component} from "react"; 2 import axios from "axios"; 3 4 import store from "../../store"; //引入store 5 class Detail extends Component{ 6 constructor(props) { 7 super(props); 8 9 this.state = { 10 filminfo:null 11 }; 12 } 13 14 render(){ 15 return <div> 16 { 17 this.state.filminfo? 18 <div> 19 <img src={this.state.filminfo.cover.origin}/> 20 <h2>{this.state.filminfo.name}</h2> 21 </div> 22 :null 23 } 24 </div> 25 } 26 27 componentWillMount(){ 28 //获取路由参数 29 console.log(this.props.match.params.kerwinid); 30 31 axios.get(`/v4/api/film/${this.props.match.params.kerwinid}?__t=1540450246836`).then(res=>{ 32 this.setState({ 33 filminfo:res.data.data.film 34 }) 35 36 //dispatch action 到 store 中 37 store.dispatch({ 38 type:"changetitle", 39 payload:res.data.data.film.name 40 }) 41 }) 42 } 43 } 44 45 export default Detail;
--------------------------store/reducer----------------------------------
1 import {createStore,combineReducers} from "redux" ;//创建store 2 3 import titlereducer from "./reducers/titleReducer"; 4 import listreducer from "./reducers/listReducer"; 5 6 // state [] =>[1,2,3,4,5,6]=>[1,2,3,6.8..9] 7 var reducer = combineReducers({ 8 titlereducer, 9 listreducer 10 }) 11 12 const store = createStore(reducer); 13 14 15 export default store;
-----------------------------------------listreducer-------------------------------
1 var listreducer = (prevState=[],action={})=>{ 2 //prevstate 得到的老状态, 3 //action {type:"changelist",payload:[1,2,3,4,5,6]} 4 var type=action.type; 5 6 switch(type){ 7 case "changelist": 8 return [...prevState,...action.payload] 9 default: 10 return prevState 11 } 12 return prevState; 13 // store.title=action.pa 14 } 15 16 17 export default listreducer;
------------------------------------------titlereducer--------------------------------
1 //reducer (纯函数) 2 var titlereducer = (prevState="卖座电影1",action={})=>{ 3 console.log("reducer--",action); 4 //prevstate 得到的老状态, 5 //action {type:"changetitle",payload:"铁血战士"} 6 var type=action.type; 7 8 switch(type){ 9 case "changetitle": 10 return action.payload 11 default: 12 return prevState 13 } 14 return prevState; 15 // store.title=action.pa 16 } 17 //store 卖座电影=>铁血战士=maizuo =>=> 18 export default titlereducer;
--------------------------redux异步处理-----------------------------------
--------------------------store----------------------
1 import { createStore,combineReducers } from 'redux'; 2 import titlereducer from "./reducers/titlereducer.js"; 3 import listreducer from "./reducers/listreducer.js"; 4 5 import {applyMiddleware,compose} from 'redux'; 6 import reduxthunk from "redux-thunk"; 7 8 const reducer = combineReducers({ 9 titlereducer, 10 listreducer 11 }) 12 13 const store = createStore(reducer,applyMiddleware(reduxthunk)); 14 15 16 17 export default store;
-----------------------------home中-----------------------------
1 import React,{Component} from "react"; 2 import axios from "axios"; 3 import "./index.scss"; 4 import {connect} from "react-redux"; 5 import store from "../../Store" 6 7 class App extends Component { 8 constructor(props){ 9 super(props) 10 this.state={ 11 list:[] 12 } 13 } 14 15 render(){ 16 return <div id="Home"> 17 { 18 this.state.list.map(item=> 19 <img src={item.cover.origin} alt="" onClick={this.handleClick.bind(this,item.id)} key={item.id}/> 20 ) 21 } 22 </div> 23 } 24 25 componentDidMount(){ 26 27 if (store.getState().listreducer.length===0) { 28 console.log('aaa+++++++++++++++++++++') 29 axios.get("/v4/api/film/coming-soon?__t=1540512121692&page=1&count=3").then((res)=>{ 30 // console.log(res.data.data.films) 31 this.setState({ 32 list:res.data.data.films 33 }) 34 store.dispatch({ 35 type:"changelist", 36 payload:res.data.data.films 37 }) 38 }) 39 }else { 40 41 42 // console.log(store.getState().listreducer) 43 this.setState({ 44 list:store.getState().listreducer 45 }) 46 47 console.log("bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb") 48 49 50 } 51 52 53 54 55 56 57 58 59 store.dispatch({ 60 type:"changetitle", 61 payload:"卖座电影" 62 }) 63 64 65 // if (this.props.list.length===0){ 66 // this.props.getHomeListThunk(); 67 // }; 68 } 69 70 71 componentWillUnmount(){ 72 this.setState = (state,callback)=>{ 73 return; 74 }; 75 } 76 77 handleClick(id){ 78 this.props.history.push(`/detail/${id}`) 79 } 80 } 81 82 // export default connect( 83 // (state)=>{return {list:state.listreducer}}, 84 // { 85 // getHomeListThunk(){ 86 // return (dispatch)=>{ 87 // axios.get("/v4/api/film/coming-soon?__t=1540512121692&page=1&count=3").then(res=>{ 88 // dispatch({ 89 // type:"changelist", 90 // payload:res.data.data.films 91 // }) 92 // }) 93 // } 94 // } 95 // } 96 97 // )(App); 98 99 100 export default App;