元芳,你怎么看Redux?

生活不止眼前的苟且,还有诗和远方,远方除了远一无所有。-------反正不是我

<br />

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

网上盗张图


Paste_Image.png

<br />

redux.gif

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

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

Paste_Image.png

接上门课程(//www.greatytc.com/p/3089495d8532
来继续写

既然是使用了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 。 看如下截图

Paste_Image.png

我们看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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容