redux2 - 原生html页面和react中使用自己手写的 - redux

原生html页面中

redux.js

// 创建仓库
function createStore(reducer) {
  let currData;
  let listeners = [];
  const getState = () => currData;
  const dispatch = (action) => {
    currData = reducer(currData, action);
    listeners.forEach((fn) => fn());
  };
  const subscribe = (listener) => {
    listeners.push(listener);
    return function () {
      listeners = listeners.filter((fn) => fn !== listener);
    };
  };
  dispatch({ type: '@@_REDUX' });
  return {
    getState,
    dispatch,
    subscribe,
  };
}

index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <h1 id="h1"></h1>
    <button id="add">+</button>
    <button id="shortened">-</button>
  </body>
  <script src="./redux.js"></script>
  <script>
  	// 获取到dom元素
    let h1 = document.getElementById('h1');
    let addBtn = document.getElementById('add');
    let shortenedBtn = document.getElementById('shortened');
    // 创建type
    const ADD = 'ADD';
    const SHORTENED = 'SHORTENED';
    // 创建reucer
    function reducer(state = { num: 0 }, action) {
      switch (action.type) {
        case ADD:
          return { num: state.num + 1 };
        case SHORTENED:
          return { num: state.num - 1 };
        default:
          return state;
      }
    }
    // 创建store 仓库
    let store = createStore(reducer);
    // 渲染视图
    function render() {
      h1.innerHTML = store.getState().num;
    }
    render();
    // 监听数据
    store.subscribe(render);
    // 添加事件
    addBtn.addEventListener('click', () => store.dispatch({ type: ADD }));
    shortenedBtn.addEventListener('click', () =>
      store.dispatch({ type: SHORTENED }),
    );
  </script>
</html>

在react 组件中使用

redux/createStore.js

export default function createStore(reducer) {
  let currData;
  let listeners = [];
  function getState() {
    return currData;
  }
  function dispatch(action) {
    currData = reducer(currData, action);
    listeners.forEach((fn) => fn());
  }
  dispatch({ type: '@@_REDUX' });
  function subscribe(listener) {
    listeners.push(listener);
    return function () {
      listeners =  listeners.filter((fn) => fn !== listener);
    };
  }
  return {
    getState,
    dispatch,
    subscribe,
  };
}

redux/index.js

import createStore from './createStore';
export { createStore };

index.js

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { createStore } from './redux';

// 初始数据
let initData = {
  num: 10,
};
// type 类型
const ADD = 'ADD';

// 创建reducer
function reducer(state = initData, action) {
  switch (action.type) {
    case ADD:
      return {
        num: state.num + 1,
      };
    default:
      return state;
  }
}
// 创建数据源
let store = createStore(reducer);

// 解构出数据
const { num } = store.getState();

class App extends Component {
  state = {
    num,
  };
  componentDidMount() {
    // 订阅数据
    this.unSubscribe = store.subscribe(() =>
      this.setState({
        num: store.getState().num,
      }),
    );
  }
  componentWillUnmount() {
    // 取消订阅
    this.unSubscribe();
  }
  render() {
    return (
      <div>
        <p>{this.state.num}</p>
        <button onClick={() => store.dispatch({ type: ADD })}>+</button>
      </div>
    );
  }
}
ReactDOM.render(<App />, document.getElementById('root'));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值