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;

 

posted on 2018-10-30 13:23  杨学友  阅读(146)  评论(0编辑  收藏  举报

导航