//封装组件的action
import {ADD_ITEM , DELETE_ITEM ,GET_LIST} from ‘./actionTypes’ //定义type类型的js
import axios from ‘axios’
//组件addItem里的action type已经封好 所以把value作为参数用箭头函数(value)=>传进来即可
//增加数据
export const addItem = (value)=>({
type:ADD_ITEM,
value
})
//删除数据
export const deleteItem = (index)=>({
type:DELETE_ITEM,
index
})
//获取数据
export const getListAction = (data)=>({
type:GET_LIST,
data
})
export const getTodoList = () =>{
return (dispatch)=>{
axios.get(‘https://www.easy-mock.com/mock/5d63d7ca5774121e1a634378/demo1/demo1’)
.then((res)=>
{
const data = res.data.data;
const action = getListAction(data)
dispatch(action) //将action这个值传给仓库
})
.catch((error)=>{
console.log(error)
})
}
}
TodoList.js 组件js部分
import React, { Component } from ‘react’;
import TodoListUi from ‘./TodoListUi’ //组件UI部分
import store from ‘…/store/index’ //组件中获得store中的数据
//import {ADD_ITEM , DELETE_ITEM} from ‘…/store/actionTypes’ //定义type类型的js 为了更方便检查错误 写错会报错
import { addItem,deleteItem,getTodoList } from ‘…/store/actionCreators’ //封装的action
//用reducer写todolist 调用中央仓库
class TodoList extends Component {
constructor(props){
super(props)
// console.log(store.getState()) //getState方法取出仓库的值
this.state = store.getState() //将组件state数据赋值给仓库数据
this.changeInputVlaue = this.changeInputVlaue.bind(this) //给方法做this绑定
this.storeChange = this.storeChange.bind(this)
this.clickBtn = this.clickBtn.bind(this)
this.deleteItem = this.deleteItem.bind(this)
store.subscribe(this.storeChange) //订阅模式 改变数据时同步让仓库中的数据改变
}
render() {
return (
value={this.state.value} changeInputVlaue={this.changeInputVlaue} clickBtn={this.clickBtn} list={this.state.list} deleteItem = {this.deleteItem} ); } componentDidMount(){ // axios.get(‘https://www.easy-mock.com/mock/5d63d7ca5774121e1a634378/demo1/demo1’) // .then((res)=> // { // const data = res.data.data; // const action =getListAction(data) //将取到的数据封入action // store.dispatch(action) //传递给reducer // }) // .catch((error)=>{ // console.log(error) // }) const action = getTodoList() //使用中间件获取数据 store.dispatch(action) //传给仓库 } //用户输入的值传给仓库 要通过dispatch()方法传递给store //Action就是一个对象,这个对象一般有两个属性,第一个是对Action的描述,第二个是要改变的值。 //之前注销的方法,在reducer里深拷贝完state里面的数据,无法同步将用户输入赋值给state changeInputVlaue(e){ this.setState({ value:e.target.value //将用户输入的value绑定给仓库中的value,监听用户输入 }) // const action = { // type:‘changeInput’, // 名字 // value:e.target.value //值 // } // store.dispatch(action) } //state和组件的值同步互相改变 storeChange(){ this.setState(store.getState()) } //增加 因为list数据存在中央仓库里 所以要做的是 将组件数据传给仓库 改变仓库数据后 再返回给组件展示 clickBtn(){ // console.log(this.state.value) // const action = { // type:ADD_ITEM, // value:this.state.value //获取到用户value,用于push // } const action = addItem(this.state.value); store.dispatch(action) } //删除 deleteItem(index){ // console.log(index) // const action = { // type:DELETE_ITEM, // index //index传过去用于删除 // } const action =deleteItem(index) store.dispatch(action) } } export default TodoList; TodoListUi.js 组件UI部分抽离成子组件 //此文件用于视图和逻辑的分离 import React from ‘react’; import ‘antd/dist/antd.css’ //引入Ant Design UI库 import { Input ,Button,List} from ‘antd’ //引入input组件 //无状态组件 提高性能 将组件改造成函数 const TodoListUi = (props)=>{ return ( 小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频 如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端) 最后 基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。 习笔记、源码讲义、实战项目、讲解视频** 如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端) [外链图片转存中…(img-AVtEBPLJ-1710832476509)] 最后 基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架玩的再6,webpack、git、node学习的再好也无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司。前端的基础知识杂且多,并不是理解就ok了,有些是真的要去记。当然了我们是牛x的前端工程师,每天像背英语单词一样去背知识点就没必要了,只要平时工作中多注意总结,面试前端刷下题目就可以了。 开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】 参考文章
发表评论