• 怎么看Redux?


    刚接触react,发现还要学redux,感觉推开一扇技术之门,发现是更多的门。没精力写的很细。

    网上盗张图


     
     

    让我们一切从0开始,先安装redux react-redux react-router-redux redux-thunk redux-logger --save

    这样install redux-thunk 的原因是使用到了异步

     

    接上门课程(https://www.cnblogs.com/passkey/p/10671644.html
    来继续写

    既然是使用了react ,所以可以新建个普通的component ,名字叫Home . 由于写多了swift , 所以习惯写class 类的方法定义component

    先上整个class Home代码,直接代码里面注释。不然文章太长。

    import React , { Component } from 'react';
    //这是Action
    import { fetchPosts , fetchRefreshPosts } from '../actions/handle'
    import { bindActionCreators } from 'redux'
    import { connect } from 'react-redux'
    
    class Home extends Component {
    
    //这是系统钩子,hook,这在swift中很普遍。也很容易理解,在component 特定的时候触发,下面是组件安装完成触发
    componentDidMount(){
        console.log(`=componentDidMount=`);
        this.props.fetchPosts()
    }
    
    //这是系统钩子,hook,这在swift中很普遍。也很容易理解,
    //在component 特定的时候触发,下面是组件更改props的时候触发,
    //这个时候不能继续dispatch(派遣)任务。例如。不能使用this.props.fetchRefreshPosts() 方法。不然无限循环。
    componentWillReceiveProps(nextProps){
      console.log(`=componentWillReceiveProps=`);
      console.log(nextProps);
    }
    
    handlerefreshData(e){
      e.preventDefault()
      //由于mapDispatchToProps了方法,所以可以直接使用this.props.fetchRefreshPosts()
      this.props.fetchRefreshPosts()
    }
    
    render(){
      const { json2 , number , isFetching} = this.props
      console.log(`json2===========`)
      console.log(json2);
      const isEmpty = json2.length === 0
      console.log(isFetching);
      return (<div>
        <h3>Home containers <a href='#' onClick={this.handlerefreshData.bind(this)}>刷新o</a></h3>
      <ul >
        //render 自然不必多说,值得一提的是,在map的时候。返回的元素(element) 需要加个Key 。
        //不然会报错。这个ng-repeat 有点像,记得ng-repeat 是不会报错的,如下 key={index}
        {!isEmpty && json2.map((item , index) => {
          return <li key={index}>{number}{item.title}</li>
        })}
      </ul>
      </div>)
    }
    }
    
    //这2个方法看名字mapStateToProps也知道是把state 的一些方法映射到this.props上面
    function mapStateToProps(state){
      return {
        json2 : state.linkf.data || [],
        number : state.linkf.number || 0,
        isFetching : state.linkf.isFetching || true
      }
    }
    //这2个方法看名字mapDispatchToProps也知道是把Dispatch 的一些方法映射到this.props上面
    function mapDispatchToProps(dispatch){
      return {
      fetchPosts : () => {
        dispatch(fetchPosts())
      },
        fetchRefreshPosts : () => {
          dispatch(fetchRefreshPosts())
          }
        }
    }
    
    //这里是把json2 , number ,isFetching , fetchPosts ,fetchRefreshPosts
    // 等属性和方法 绑定到this.props 上面。这样就
    //可以使用 const {json2 , isFetching , fetchPosts} = this.props等
    
    export default connect(mapStateToProps,mapDispatchToProps)(Home)

    我们在来读预设的常量

    //保存在一个单独的文件,//constant.js
    // action常量
    export const INCREASE = 'INCREASE'
    export const DECREASE = 'DECREASE'
    export const LOADDATA = 'LOADDATA'
    export const GETSUCCESS = 'GETSUCCESS'
    export const REFRESH = 'REFRESH'
    export const REFRESHDATA = 'REFRESHDATA'
    export const SAVENOTE ='SAVENOTE';
    export const SAVENOTESUCCESS ='SAVENOTESUCCESS';

    在来个actionCreate

    import { INCREASE, DECREASE, GETSUCCESS, REFRESHDATA,SAVENOTE , REFRESH } from './constants'  // 引入action类型名常量
    import 'whatwg-fetch';  // 可以引入fetch来进行Ajax;
    const ul = `http://api.linked-f.com/test/weixin/lesson?code=Aaaaaaaaaaaa%2CB&openid=wapCode&specialCode=&currentPath=%2Ftest%2Fhtml%2Findex.html&lessonId=632&type=online_info`
    const ul2 = `http://api.linked-f.com/test/weixin/lessonlist?code=Aaaaaaaaaaaa%2CB&openid=wapCode&specialCode=&currentPath=%2Ftest%2Fhtml%2Findex.html&type=live_info&limit=10`
    // 这里的方法返回一个action对象
    
    //刷新的actionCreate
    export const refreshData = () => {
        return {
            type: REFRESHDATA
        }
    }
      
    //成功的actionCreate
    export const getSuccess = (json) => {
      console.log(`getSuccess`)
      console.log(json);
        return {
            type: GETSUCCESS,
            json : json.result.lessonList
        }
    }
    
    export const refreshHandle = (json) => {
      console.log(`REFRESH`)
      console.log(json);
        return {
            type: REFRESH,
            json : json.results
        }
    }
    
    
    export function fetchPosts() {
        return dispatch => {
            return fetch(ul)
                .then((res) => { console.log(res.status); return res.json() })
                .then((data) => {
                    dispatch(getSuccess(data))
                })
                .catch((e) => { console.log(e.message) })
            }
    }
    
    export function fetchRefreshPosts() {
        return dispatch => {
            return fetch(ul2)
                .then((res) => { console.log(res.status); return res.json() })
                .then((data) => {
                    dispatch(refreshHandle(data))
                })
                .catch((e) => { console.log(e.message) })
            }
    }

    在来看最后1个reducer 。 每dispatch一个actionCreate , 系统都自动回reducer,不用你操心数据怎么变,因为我们在createStore 的时候绑定了reduer 。 看如下截图

     

    我们看reducer 代码

    // reducers/count.js
    import { INCREASE, DECREASE, GETSUCCESS, REFRESHDATA , REFRESH} from '../actions/constants' // 引入action类型常量名
    
    // 初始化state数据
    const initialState = {
        id: 1
    }
    
    // 通过dispatch action进入
    export default function update(state = initialState, action) {
    
    // 根据不同的action type进行state的更新
    switch(action.type) {
      
    
        case GETSUCCESS:
            console.log(`reducer`)
            console.log(action.json)
            let n = Object.assign({}, state, { data: action.json , id : 2 , isFetching : false })
            console.log(n)
            return n
        case REFRESH:
                console.log(`REFRESH`)
                console.log(state)
                let ns = Object.assign({}, state, { data: action.json , id : 3 , isFetching : false})
                console.log(ns)
    
           return ns
        
        default:
            return state
    }
    }

    reducer 的路口

    // reducers/index.js
    import { combineReducers } from 'redux' // 利用    combineReducers 合并reducers
    import { routerReducer } from 'react-router-redux' // 将routerReducer一起合并管理
    import linkf from './count' // 引入update这个reducer
    
      //这里写linkf 是。在使用state的时候就这样,例如state.linkf.json2。
    //reducer 返回最终的数据。总入口写错linkf,当然都可以换其他的。linkf就心json的属性
    
    export default combineReducers({
        linkf,
        routing: routerReducer
    })

    至此 。action , reducer 都有了。也把store 帮到了component 上面。就可以运行了。

    至此这个demo 加上上篇路由,几乎覆盖了前端所有常用的只是点。

    文章稿纸的地址详见githubhttps://github.com/976500133/react-router-demo



    作者:二月长河
    链接:https://www.jianshu.com/p/2357039e3b5f
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    Vue 组件之间传值(父子组件传值,vuex传值)
    利用computed和watch实现监听Vuex状态监听
    ESlint+VSCode自动格式化
    MySQL之分组查询(DQL)
    MySQL之排序查询(DQL)
    MySQL之条件查询(DQL)
    MySQL之概述
    jQuery之轮播图
    jQuery之添加删除记录
    jQuery之爱好选择
  • 原文地址:https://www.cnblogs.com/passkey/p/10668696.html
Copyright © 2020-2023  润新知