一、axios
概念:Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。(个人理解就是ajax,用来请求和响应数据)
安装命令:yarn add axios 或者 npm install axios
二、无状态组件
概念:无状态组件顾名思义就是没有状态的组件,如果一个组件不需要管理 state 只是纯的展示,那么就可以定义成无状态组件
(个人理解就是只有reder和dom就可以改变为无状态组件)
三、代码实例
请先学习Redux的使用:https://blog.csdn.net/qq_17025903/article/details/102628320
ShowList.js
import React,{ Component } from 'react';
import 'antd/dist/antd.css'; // or 'antd/dist/antd.less'
import { Input,Button,List } from 'antd';
import store from '../store';
import ShowListUI from '../UI/ShowListUI';
import {CHANGE_INPUT_VALUE,ADD_TODO_ITEM,DELETE_TODO_ITEM,INIT_LIST_ACTION} from '../store/actionTypes';
import {getInputChangeAction,getAddItemAction,getDeleteItemAction,initListAction} from '../store/actionCreators';
import axios from 'axios';//全局数据
// const data = [
// 'Racing car sprays burning fuel into crowd.',
// 'Japanese princess to wed commoner.',
// 'Australian walks 100km after outback crash.',
// 'Man charged over missing wedding girl.',
// 'Los Angeles battles huge wildfires.',
// ];class showList extends Component{constructor(props){super(props);//创建数据this.state=store.getState();this.handleInputChange=this.handleInputChange.bind(this);this.handleStoreChange=this.handleStoreChange.bind(this);this.handleBtnClick=this.handleBtnClick.bind(this);this.handleItemDelete=this.handleItemDelete.bind(this);//监听返回组件的数据,并且同步数据。store.subscribe(this.handleStoreChange);}render(){return()}// render(){// return(// //
// {/*antd Input文本框*/}// // {/*antd button按钮*/}// // {/*列表*/}// (// // {item}// // )}// />//
//
//// )// }componentDidMount(){axios.get('http://localhost:8080/20190124_V1.0_SpringBoot/user/queryAllUserInfo').then((res)=>{const data=res.data;const newState=JSON.parse(JSON.stringify(data[0].age))console.log(res);console.log(res.data);const action=initListAction(data);console.log(action);store.dispatch(action);})}//actionhandleInputChange(e){
/* const action={type:CHANGE_INPUT_VALUE,value:e.target.value};*/const action=getInputChangeAction(e.target.value);//action传递到storestore.dispatch(action);}//点击提交添加到列表handleBtnClick(){
/* const action={type:ADD_TODO_ITEM};*/const action= getAddItemAction();store.dispatch(action);}//删除列表点击的内容handleItemDelete(index){// const action={// type:DELETE_TODO_ITEM,// index:index// }const action= getDeleteItemAction(index);store.dispatch(action);}//同步数据handleStoreChange(){this.setState(store.getState)}
}
export default showList;
antdList.js
import React from 'react';
import ShowList from '../components/ShowList';export default function() {return (
);
}
创建UI文件夹,拆分dom为ShowListUI.js
redux store 为index.js
//store 存数据传递reducer处理
import {createStore} from 'redux';
import reducer from './reducer';import React from "react";
//window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__() 为 redux devtools工具配置
const store=createStore(reducer, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__());export default store;
reducer.js
import {CHANGE_INPUT_VALUE,ADD_TODO_ITEM,DELETE_TODO_ITEM,INIT_LIST_ACTION} from '../store/actionTypes';
import TodoItem from "@/components/TodoItem";
import React from "react";
//reducer可以接收state但是不能修改state
//处理数据
//defaultState store默认值
const defaultState={inputValue:'123',list:[1,2]
}
//state上一次存储的数据
//action传过来改变的
export default (state=defaultState,action)=>{console.log(state,action);if(action.type===CHANGE_INPUT_VALUE){//复制一份数据const newState=JSON.parse(JSON.stringify(state))//修改newState.inputValue=action.value;return newState;}//添加到列表if(action.type===ADD_TODO_ITEM){const newState=JSON.parse(JSON.stringify(state))newState.list.push(newState.inputValue);newState.inputValue='';return newState;}//删除点击列表内容if(action.type===DELETE_TODO_ITEM){const newState=JSON.parse(JSON.stringify(state))newState.list.splice(action.index,1);return newState;}if(action.type===INIT_LIST_ACTION){//复制一份数据const newState=JSON.parse(JSON.stringify(state))newState.list2=[ ...newState.list];action.data.map((item)=>{newState.list2.push(item.age);})newState.list=newState.list2;return newState;}return state;
}
actionTypes.js
//定义常量
export const CHANGE_INPUT_VALUE='change_input_value';
export const ADD_TODO_ITEM='add_todo_item';
export const DELETE_TODO_ITEM='delete_todo_item';
export const INIT_LIST_ACTION='init_list_action';
actionCreators.js
import {CHANGE_INPUT_VALUE,ADD_TODO_ITEM,DELETE_TODO_ITEM,INIT_LIST_ACTION} from '../store/actionTypes';export const getInputChangeAction=(value)=>({type:CHANGE_INPUT_VALUE,value:value
});
export const getAddItemAction=()=>({type:ADD_TODO_ITEM
});
export const getDeleteItemAction=(index)=>({type:DELETE_TODO_ITEM,index:index
});export const initListAction=(data)=>({type:INIT_LIST_ACTION,data:data
});
请求的接口为springboot的 queryAllUserInfo
四、完成结果
list:[1,2]数组添加了请求服务的age,并且可以点击删除。