React学习笔记5:学习Redux

前端之家收集整理的这篇文章主要介绍了React学习笔记5:学习Redux前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

新搭建的个人博客,本文地址:React学习笔记5:学习Redux

好久没写东西了!!!!@H_403_3@Redux是React官方推荐数据流管理方法Flux的实现之一,当然Redux是非必选,仅仅是众多实现中可选项罢了,不过是最大众选择!

Redux的详细介绍可以看下其他童鞋的文章,比如:[Redux 介绍],总之一搜有很多文章,本文直接引导如何使用。

1、搭建一个基础Hello world的React项目,参考React学习笔记1:环境搭建

  1. import React from 'react'
  2. import ReactDom from 'react-dom'
  3.  
  4. class Hello extends React.Component
  5. {
  6. constructor(props) {
  7. super(props)
  8. }
  9. render() {
  10. return (
  11. <div>
  12. Hello World
  13. </div>
  14. )
  15. }
  16. }
  17.  
  18. ReactDom.render(
  19. <Hello />,document.getElementById('example')
  20. );

2、修改相关代码,点击一个button,翻译Hello world为『您好,世界』

  1. import React from 'react'
  2. import ReactDom from 'react-dom'
  3.  
  4. class Hello extends React.Component
  5. {
  6. constructor(props) {
  7. super(props)
  8. this.state = {info:'Hello World!'}
  9. }
  10. changeLang() {
  11. this.setState({info:'您好,世界!'})
  12. }
  13. render() {
  14. return (
  15. <div>
  16. <button onClick={this.changeLang.bind(this)}>翻译</button> {this.state.info}
  17. </div>
  18. )
  19. }
  20. }
  21.  
  22. ReactDom.render(
  23. <Hello />,document.getElementById('example')
  24. );

3、js有太多的语法糖,上面onClick绑定changeLang方法,在es6下也存在多种实现,比如还有如下:

  1. <button onClick={()=>this.changeLang()}>翻译</button> {this.state.info}

如果使用更新的es7语法stage-0标准,还可如下实现:

  1. //webpack.config.js 增加如下配置
  2. query: {
  3. presets: ['es2015','stage-0','react']
  4. }
  5. //函数书写方式变化
  6. changeLang = () => {
  7. this.setState({info:'您好,世界!'})
  8. }
  9. render() {
  10. return (
  11. <div>
  12. <button onClick={this.changeLang}>翻译</button> {this.state.info}
  13. </div>
  14. )
  15. }

4、引入Redux支持

  1. npm install --save redux

5、Redux的核心就是Actions、Reducers 和 Store,通俗点理解,Store存储了一颗数据总树,保存了整个应用程序的一切数据。数据的变动,或者触发数据变动的事件,都会生成一个Actions(类似消息,Flux提供了消息封装标准),Reducers是监听所有Actions的函数,根据Actions不同,做相应的处理@H_403_3@6、如上所说,首先我们要为整个应用创建一个全局的Store

  1. import {createStore} from 'redux'
  2. //此store可以存在全局,示例程序暂时存在redux组件内(constructor中)
  3. this.store = createStore(this.reducer.bind(this))

7、Actions监听执行者,也即Reducers,单独的函数,如下

  1. //此处定义了两个消息,每个消息完成自己的任务后,把数据状态在返回出去
  2. //reducer
  3. reducer(state = {},action) {
  4. console.log('reducer init state ',state,' action ',action);
  5. switch (action.type) {
  6. case 'chinese':
  7. //do something
  8. return {
  9. state,msg:'您好,世界!'
  10. }
  11. break;
  12. case 'english':
  13. //do something
  14. return {
  15. state,msg:"Hello World!"
  16. }
  17. break;
  18. default:
  19. return state
  20. }
  21. }

8、OK,发送一个消息!消息一般都是由一个Actions指定,Actions其实也是一个函数,消息类型就是json对象

  1. sendShowChineseMsg = () => {
  2. return {
  3. type:'chinese'
  4. }
  5. }

9、分发消息吧,刷新页面,打开Console,点击翻译,看下消息详情

  1. changeLang = () => {
  2. //this.setState({info:'您好,世界!'})
  3. this.store.dispatch(this.sendShowChineseMsg())
  4. }
  1. //第一遍是系统初始化,系统发出init消息,第二次刷新可以看到chinese消息,第三次刷新会把前一次的状态及消息发出来
  2. reducer init state Object {} action Object {type: "@@redux/INIT"}
  3. bundle.js:99 reducer init state Object {} action Object {type: "chinese"}
  4. bundle.js:99 reducer init state Object {state: Object,msg: "您好,世界!"} action Object {type: "chinese"}

10、ok,接收消息做出响应(利用store的subscribe方法,执行监听),看下效果

  1. this.store.subscribe(() => {
  2. console.log('store_0 has been updated. Latest store state:',this.store.getState());
  3. // 更新你的React数据
  4. this.setState({info:this.store.getState().msg})
  5. })

11、如上已经完成了消息的创建、传递、处理,而且完全融合在React中,不过Redux跟React融合在一起,官方提供更好的react-redux融合,我这样去做,只是更好的去理解Redux@H_403_3@12、点击完翻译后,5s后自动翻译回英文

  1. changeLang = () => {
  2. //this.setState({info:'您好,世界!'})
  3. this.store.dispatch(this.sendShowChineseMsg())
  4. setTimeout(()=>{
  5. this.store.dispatch(this.sendShowEnglishMsg())
  6. },5000)
  7. }
  8. sendShowEnglishMsg = () => {
  9. return {
  10. type:'english'
  11. }
  12. }

13、放出完整示例

  1. import React from 'react'
  2. import ReactDom from 'react-dom'
  3. import {createStore} from 'redux'
  4. class Hello extends React.Component
  5. {
  6. constructor(props) {
  7. super(props)
  8. this.state = {info:'Hello World!'}
  9. this.store = createStore(this.reducer)
  10. this.store.subscribe(() => {
  11. console.log('store_0 has been updated. Latest store state:',this.store.getState());
  12. // 更新你的React数据
  13. this.setState({info:this.store.getState().msg})
  14. })
  15. }
  16.  
  17. changeLang = () => {
  18. //this.setState({info:'您好,5000)
  19. }
  20.  
  21. sendShowChineseMsg = () => {
  22. return {
  23. type:'chinese'
  24. }
  25. }
  26. sendShowEnglishMsg = () => {
  27. return {
  28. type:'english'
  29. }
  30. }
  31.  
  32. reducer = (state = {},action) => {
  33. console.log('reducer init state ',action);
  34. switch (action.type) {
  35. case 'chinese':
  36. return {
  37. state,世界!'
  38. }
  39. break;
  40. case 'english':
  41. return {
  42. state,msg:"Hello World!"
  43. }
  44. break;
  45. default:
  46. return state
  47. }
  48. }
  49. render() {
  50. return (
  51. <div>
  52. <button onClick={this.changeLang}>翻译</button> {this.state.info}
  53. </div>
  54. )
  55. }
  56. }
  57.  
  58. ReactDom.render(
  59. <Hello />,document.getElementById('example')
  60. );

猜你在找的React相关文章