前端开发的演变
静态页面-AJAX-前端MVC-SPA
ReactJS
ReactJS把复杂的页面,拆分成一个个的组件,将这些组件一个个的拼装起来,就会呈现多样的页面。ReactJS可以用于 MVC 架构,也可以用于 MVVM 架构,或者别的架构
JSX语法
JSX语法就是,可以在js文件中插入html片段,是React自创的一种语法
在JSX语法中,只能有一个根标签,不能有多个
const div1 = <div>right</div>;
const div2 = </div>error</div></div>error</div>;
- 函数调用
<div>{f()}</div> // f是函数名
组件
- 组件定义
import React from 'react';
class HelloWorld extends React.Component{
    
    render() { // 重写渲染方法
        return <div>cxk:jntm</div>
    }
}
export default HelloWorld; // 导出该类
- 使用自定义组件
import React from 'react';
import HelloWorld from "./HelloWorld";
class Show extends React.Component{
    
    render() {
        return <HelloWorld/>
    }
}
export default Show;
- 组件参数传递
// 属性传递              标签包裹传递
<HelloWorld name="cxk"> 蔡徐坤</HelloWorld>
// 接收
<div>{this.props.name}:{this.props.children}</div>
- 组件状态
每一个组件都有一个状态,其保存在this.state中,当状态值发生变化时,React框架会自动调用render()方法,重新渲染页面
- this.state值的设置要在构造参数中完成
- 要修改this.state的值,需要调用this.setState()完成,不能直接对其进行修改
class HelloWorld extends React.Component{
    constructor(props, context) {
        super(props, context);
        this.state = {
            dataList : [1,2,3]
        };
    }
    render() { // 重写渲染方法
        return <div>
            <ul>
                {
                    this.state.dataList.map((value,index)=>{
                      return <li>{value}</li>
                    })
                }
            </ul>
            <button onClick={()=>{
                let list = this.state.dataList;
                list.push(Math.random());
                this.setState({dataList:list})
            }}>click</button>
        </div>
    }
}
- 生命周期

添加钩子方法
class HelloWorld extends React.Component{
    // 组件挂载后调用
    componentDidMount() {
        console.log("组件挂载后...");
    }
    // 省略其他
}
前端代码分层
- Page 负责与用户直接打交道:渲染页面、接受用户的操作输入,侧重于展示型交互 性逻辑
- Model 负责处理业务逻辑,为 Page 做数据、状态的读写、变换、暂存等
- Service 负责与 HTTP 接口对接,进行纯粹的数据读写
使用DVA进行数据分层管理
- 添加models
export default {
    namespace : 'list',
    state:{
        data:[1,2,3]
    }
}
- 使用数据
import React from 'react'
import {connect} from 'dva'
const namespace = 'list'
const map = (state)=>{
    const list = state[namespace].data;
    return {
        list
    }
};
@connect(map)
class List extends React.Component{
    render() {
        return <ul>
            {
                this.props.list.map((v,i)=>{
                    return <li>{v}</li>
                })
            }
        </ul>
    }
}
export default List;
- 修改数据
export default {
    namespace: 'list',
    state: {
        data: [1, 2, 3]
    }
    ,
    reducers: {
        addNewData(state){
            let list = [...state.data,Math.random()];
            console.log(list);
            return {
                data:list
            }
        }
    }
}
// 省略导入
// 省略map1
const map1 = (dispatch)=>{
    return {
        addNewData:()=>{
            dispatch(
                {
                    type:namespace+"/addNewData"
                }
            )
        }
    }
}
@connect(map,map1)
class List extends React.Component{
    render() {
        return <ul>
            {
                this.props.list.map((v,i)=>{
                    return <li>{v}</li>
                })
            }
            <button onClick={()=>{
                this.props.addNewData()
            }}>
                点击
            </button>
        </ul>
    }
}
export default List;