react-redux(函数组件——精简版)

修改前:

 点击添加后:

 点击切换颜色后:

一、 在入口文件index.js中用Provider标签包裹

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from "./App"
import reportWebVitals from './reportWebVitals';
import store from './redux/store';
import { Provider } from 'react-redux';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <Provider store={store} >
    <React.StrictMode>
      <App />
    </React.StrictMode>
  </Provider>
);

二、 在App.js文件中正常引入文件

import './App.css';
import Index from './page/Index';

function App() {
  return (
    <div className="App">
      <Index></Index>
    </div>
  );
}

export default App;

三、 创建文件夹redux,文件分别是store.js和reducer.js

store.js如下:

import { createStore} from 'redux'
import colorReducer from './reducer'


const store = createStore(colorReducer)

export default store

reducer.js如下:

const init = { color: 'red', todo: [{ 'name': '张哥' }] }
export default function colorReducer(preState = init, action) {
    const { type, data } = action
    switch (type) {
        //切换颜色
        case 'sui':
            // preState.color = data
            return {color:data,todo:[...preState.todo]}
        //添加
        case 'todo':
            return {color:preState.color,todo:[...preState.todo,data]}
        default:
            return preState;
    }
}

四、 渲染的组件 (page/Index.js)


import React from 'react'
import { connect } from 'react-redux'

function Index(props) {
  return (
    <div style={{ background: props.color, width: '200px', height: '200px' }}>
      {
        props.todo.map((item, index) => {
          return (
            <div key={index}>{item.name}</div>
          )
        })
      }
      <button onClick={props.todo1}>添加</button>
      <button onClick={props.todo2}>变蓝</button>
    </div>
  )
}

// mapStateToProps
const MSTP = (state) => {
  console.log(state, 'state');
  return {
    ...state
  }
}

// mapDispatchToProps
const MDTP = (dispatch) => {
  let obj = { 'name': '大哥' }
    //随机生成颜色
    function createColor() {
      let str = '0123456789abcdef'
      let colors = '#'
      for (let i = 0; i < 6; i++) {
        colors += str[Math.floor(Math.random() * 16)]
      }
      return colors
    }
  return {
    // 添加
    todo1: () => dispatch({ type: 'todo', data: obj }),
    // 换背景颜色
    todo2: () => dispatch({ type: 'sui', data: createColor() }),
  }
}

const Con = connect(MSTP, MDTP)(Index)

export default Con

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值