React入门

摘要:
react中自定义组件四个步骤://1.引入reactimportReactfrom'react';//2.编写类继承React.ComponentclassHelloWorldextendsReact.Component{//3.重写render方法,用于渲染页面render(){return;}}//4.导出该类exportdefaultHelloWorld;导入自定义组件:importReactfrom'react';importHelloWorldfrom"./HelloWorld";classShowextendsReact.Component{render(){return;}}exportdefaultShow组件是可以传递参数的,name="张三"就是参数传递,安徽合肥就是标签包裹的内容传递。React为这些阶段提供了钩子方法,允许开发者自定义每个阶段自动执行的函数。

1.JSX语法

JSX语法就是,可以在js文件中插入html片段,是react自创的一种语法

JSX语法会被Babel等转码工具进行转码,得到正常的js代码再执行。

注意:

1.所有的html标签必须是闭合的

2.再jsx语法中,只能有一个根标签

2.组件

组件是react中核心概念,一个网页,可以被拆分成一个个组件。

react中自定义组件四个步骤:

//1.引入react
import React from 'react';

//2.编写类继承React.Component
class HelloWorld extends React.Component{

    //3.重写render方法,用于渲染页面
    render() {
        return (
          <div>
                hello world,我是{this.props.name},年龄{this.props.age},{this.props.children}人
          </div>
        );
    }
}

//4.导出该类
export default HelloWorld;

导入自定义组件:

import React from 'react';
import HelloWorld from "./HelloWorld";

class Show extends React.Component{
    render() {
        return (
            <HelloWorld name="张三" age="18">安徽合肥</HelloWorld>
        );
    }
}

export default Show

组件是可以传递参数的 ,

name="张三"就是参数传递,安徽合肥就是标签包裹的内容传递。
在HellloWorld组件中,接收参数:
属性:this.props.name 接收
标签内容:this.props.children 接收

组件的状态:

每一个组件都有一个状态,保存在this.state中,当state值发生变化后,react会自动调用render()方法,重新渲染页面

注意:

this.state值要设置在构造参数中完成

修改this.state的值,需要调用this.state()完成

案例:

import React from 'react';

class MyList extends React.Component{

    constructor(props) {
        super(props);
        this.state = {
            dataList : [1,2],
            num: 2
        }
    }

    render() {
        return (
            <div>
                <ul>
                    {
                        this.state.dataList.map((value,index)=>{
                            return <li key={value}>{value}</li>
                        })
                    }
                </ul>
                <button onClick={()=>this.ck()}>点击</button>
            </div>
        );
    }

    ck(){
        let dl = this.state.dataList;
        let max = dl.length+1;
        let list = [...dl,max];
        this.setState({
            dataList: list,
            num: max
        });
    }
}

export default MyList;

生命周期:

组件的运行过程中,存在不同的阶段。React 为这些阶段提供了钩子方法,允许开发者自定义每个阶段自动执行的函 数。这些方法统称为生命周期方法(lifecycle methods)

class LifeCycle extends React.Component{
    constructor(props) {
        super(props);    
        //构造方法    
        console.log("constructor()"); 
    }
    componentDidMount() {    
        //组件挂载后调用    
        console.log("componentDidMount()"); 
    }
    componentWillUnmount() {    
        //在组件从 DOM 中移除之前立刻被调用。    
        console.log("componentWillUnmount()"); 
    }
    componentDidUpdate() {    
        //在组件完成更新后立即调用。在初始化时不会被调用。    
        console.log("componentDidUpdate()"); 
    }
    shouldComponentUpdate(nextProps, nextState){   
        // 每当this.props或this.state有变化,在render方法执行之前,就会调用这个方法。    
        // 该方法返回一个布尔值,表示是否应该继续执行render方法,即如果返回false,UI 就不会更新, 默认返回true。    
        // 组件挂载时,render方法的第一次执行,不会调用这个方法。    
        console.log("shouldComponentUpdate()"); 
    }

    render() {    
        return (      
            <div>        
                <h1>React Life Cycle!</h1>      
            </div>   
        ); 
    }
}

export default LifeCycle;

3.分层

React入门第1张

前端层次介绍:

Page 负责与用户直接打交道:渲染页面、接受用户的操作输入,侧重于展示型交互 性逻辑。

Model 负责处理业务逻辑,为 Page 做数据、状态的读写、变换、暂存等。

Service 负责与 HTTP 接口对接,进行纯粹的数据读写

4.DVA进行数据分层管理

dva 首先是一个基于 redux和 redix-saga的数据流方案,然后为了简化开发体验,dva 还额外内置了 react-router和 fetch,所以也可以理解为一个轻量级的应用框架

ListData.js

export default{
    namespace:'list',
    state : {
        dataList : [1,2],
        num: 2
    },
    reducers : {
        //state指的是更新之前的状态数据
        addNewData : function (state) {
            let dl = state.dataList;
            let max = dl.length+1;
            let list = [...dl,max];
            return {
                dataList: list,
                num: max
            };
        }
    }
}

MyList.js

import React from 'react';
import { connect } from 'dva'

const namespace = 'list';

//第一个回调函数,作用:将page层和model层进行连接,返回model中的数据
//并且,将返回的数据,绑定到this.props
//第二个函数:将定义的函数绑定到this.props,调用model层中定义的函数
@connect((state)=>{
    return {
        dataList :state[namespace].dataList,
        num : state[namespace].num
    }
},(dispatch)=>{
    //dispatch:可以调用model层定义的函数,通过type属性,指定函数命名
    return {
        ck : function () {
            dispatch({
                type:namespace+"/addNewData"
            })
        }
    }
})
class MyList extends React.Component{

    constructor(props) {
        super(props);
    }

    render() {
        return (
            <div>
                <ul>
                    {
                        this.props.dataList.map((value,index)=>{
                            return <li key={value}>{value}</li>
                        })
                    }
                </ul>
                <button onClick={()=>this.props.ck()}>点击</button>
            </div>
        );
    }
}

export default MyList;

5.在model中请求数据

MockList.js模拟接口

export default {
    'get /ds/list':function (req,res) {
        res.json({
            dataList:[1,2,3],
            num:3
        });
    }
}

Model层:

import request from "../util/request";

export default{
    namespace:'list',
    state : {
        dataList:[1],
        num:1
    },
    reducers : {
        //state指的是更新之前的状态数据
        //result:请求到的数据
        addNewData : function (state,result) {
            if(result.data){
                return result.data;
            }
            let dl = state.dataList;
            let max = dl.length+1;
            let list = [...dl,max];
            return {
                dataList: list,
                num: max
            };
        }
    },
    effects:{
        //新增effects配置,用于异步加载数据 
        *initData(params,sagaEffects){
            //定义异步方法 
            const{call,put}=sagaEffects;
            //获取到call、put方法 
            consturl="/ds/list";
            //定义请求的url 
            let data=yieldcall(request,url);
            //执行请求 通过put可以调用reducers中的函数
            yieldput({
                type : "addNewData",
                data : data //传递回来的ajax数据
            });
        }
    }
}

page层:

import React from 'react';
import { connect } from 'dva';

const namespace = 'list';

//第一个回调函数,作用:将page层和model层进行连接,返回model中的数据
//并且,将返回的数据,绑定到this.props
//第二个函数:将定义的函数绑定到this.props,调用model层中定义的函数
@connect((state)=>{
    return {
        dataList :state[namespace].dataList,
        num : state[namespace].num
    }
},(dispatch)=>{
    //dispatch:可以调用model层定义的函数,通过type属性,指定函数命名
    return {
        ck : function () {
            dispatch({
                type:namespace+"/addNewData"
            })
        },
        init:()=>{
            dispatch({
                type:namespace+"/initData"
            })
        }
    }
})
class MyList extends React.Component{

    componentDidMount() {
        //初始化操作
        this.props.init();
    }

    render() {
        return (
            <div>
                <ul>
                    {
                        this.props.dataList.map((value,index)=>{
                            return <li key={value}>{value}</li>
                        })
                    }
                </ul>
                <button onClick={()=>this.props.ck()}>点击</button>
            </div>
        );
    }
}

export default MyList;

React入门第2张

免责声明:文章转载自《React入门》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转)SQL对Xml字段的操作vue+element在el-table-column中写v-if下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

内存池技术的原理与实现

6.1 自定义内存池性能优化的原理  如前所述,读者已经了解到"堆"和"栈"的区别。而在编程实践中,不可避免地要大量用到堆上的内存。例如在程序中维护一个链表的数据结构时,每次新增或者删除一个链表的节点,都需要从内存堆上分配或者释放一定的内存;在维护一个动态数组时,如果动态数组的大小不能满足程序需要时,也要在内存堆上分配新的内存空间。 6.1.1 默认内存管...

GCC高级测试功能扩展——程序性能测试工具gprof、程序覆盖测试工具gcov

gprof是GNU组织下的一个比较有用的性能测试功能:   主要功能:   找出应用程序中消耗CPU时间最多的函数;         产生程序运行时的函数调用关系、调用次数   基本原理:   首先用户要使用gprof工具,必须在GCC编译该文件的选项中添加-pg选项,然后GCC会在用户应用程序的每一个函数中加入一个名为mcount(或者是_mcount、...

Python面向对象之反射

一、补充 @classmethod 整个方法中没有用到对象命名空间中的名字,且用到了类的命名空间中的名字(普通方法和属性property除外) 类方法的默认参数:cls 调用这个发方法的类 类方法的调用方式:通过类名调用 通过类名调用的本质是方法 @statimethod 将一个普通函数放到类中来就给这个函数加一个@staticmethod装饰器 这个函...

react基础用法

React的模板是采用jsx语法   Html语法该怎么写就怎么写,遇到js代码放到大括号({})里面   注意:     1、script标签的type必须是text/babel类型     2、使用的react.js、react-dom.js、Browser.js这三个插件的位置不能乱放       react.js是react的核心       re...

Unity中Invoke函数基础用法

public voidInvoke(stringmethodName, floattime); methodName是方法名,time 是具体几秒 在具体事件以后调用这个方法 也就是说,Invoke("SendMessage",5) ,表示的是在“5s”以后执行“SendMessage”方法。 使用Invoke方法需要注意以下三点: 1、它应该在Start...

React高阶组件中使用React.forwardRef的技巧

之前使用react.forwardRef始终无法应用于react高阶组件中,最近终于捣鼓出来了,于是记录下来。关键点就是React.forwardRef的API中ref必须指向dom元素而不是React组件。 一、React.forwardRef使用示例 下面就是应用到React组件的错误示例: constA=React.forwardRef((props...