React第二天学习

内容:props、状态机、事件、
     组件通信、模拟表单双向绑定

一、组件的props

1.类组件

定义:

import React from 'react'
class Home extends React.Component{
    constructor(){
        super();
        console.log("构造函数先执行")
    }
    //渲染页面的钩子函数
    render(){
        console.log("渲染函数执行")
        return(
            <div>
                <h2>这是一个es6类定义的组件</h2>
            </div>
        )
    }
}
export default Home;

拥有构造函数等生命周期函数(业务组件/状态组件)

类组件中可以定义很多个函数、初始数据等,通过this.props接收父组件传递的数据

2.函数组件

定义:

import React from 'react'
var Movie = (props)=>{
    return(
        <div>
            <h3>这是一个函数式组件</h3>
        </div>
    )
}
export default Movie;

它没有生命周期等函数(无状态组件/木偶组件)、没有状态机。

函数组件要接收父组件传递的数据需要通过函数的形参来接收。

二、状态机

state是react中内置的状态管理器,设置一些初始数据(数据格式是对象)。

setState,react中不建议我们直接通过state.变量名来进行赋值,即使赋值成功,但是页面上的数据不会发生变化(没有重新调用render函数),推荐我们使用setState方法来改变状态机中的数据。

setState会把新的数据合并到原来的数据中,重新调用render方法。

三、事件

1.事件绑定

(1)es5方式进行绑定

<button onClick={ this.自定义函数名 }

注意:this.自定义函数名()这种方式的写法,指定的函数会自动执行

保持this指向:

<button onClick={ this.自定义函数名.bind(this) }

(2)es6方式进行绑定

<button onClick={ ()=>this.addNum() }>es6-保持this指向</button><br/>
<button onContextMenu={ (e)=>this.handle1(e) }>es6-保持this指向-事件</button>

2.传递参数

(1)es5传递参数

①事件

不需要显示的在函数中进行传递,在定义函数的形参中直接使用即可

②额外参数

如果要在函数中继续获取事件和其他参数,那么在使用bind时应该加上this,然后再传递其他参数。

<button onContextMenu={ this.handle1.bind() }>es5--事件--无参数</button>
<button onClick={ this.handle2.bind(this,'haha') }>es5--事件--有参数</button>

es5传递参数的方式,在定义函数时,形参中的事件参数应该放到所有普通参数的最后。

(2)es6传递参数

<button onClick={ (e)=>this.handle2('hehe',e) }>es6-保持this指向-事件-有参数</button>

es6要获取事件和其他额外参数时,实参传递和形参接收的顺序是一致的。

四、组件通信

1.父子组件

在父组件上使用子组件时,通过自定义属性名=属性值进行数据的传递

在子组件中,如果是类组件通过this.props.自定义属性名来接收数据

​ 如果是函数组件通过形参props.自定义属性名来接收数据

父组件:

import React,{ Component } from 'react'
//引入子组件
import Child from './Child'
export default class Parent extends Component{
    render(){
        return(
            <div>
                <h1>这是一个父组件</h1>
                <Child gift="宝马"></Child>
            </div>
        )
    }
}

子组件:

import React from 'react'
var Child = (props)=>{
    return(
        <div>
            <h2>这是一个子组件,这是父组件给的礼物:{ props.gift }</h2>
        </div>
    )
}
export default Child;

2.子父组件

在父组件使用子组件时,除了可以传递普通数据,还可以传递事件。

父组件:

state = {
        msg:''
    }
    setMsg(e){
        console.log('此事件被子组件执行了',e)
        this.setState({
            msg:e
        })
    }
    render(){
        return(
            <div>
                <h1>这是一个父组件</h1>
                <Child gift="宝马" toParent={ (e)=>this.setMsg(e) }></Child>
                <hr/>
                <h1>这是子组件发送过来的数据:{ this.state.msg }</h1>
            </div>
        )
    }

子组件:

render(){
    return(
        <div>
            <h2>这是一个子组件,这是父组件给的礼物:{ this.props.gift }</h2>
            <button onClick={ ()=>this.props.toParent('口罩100个') }>发送数据</button>
        </div>
    )
} 

3.DOM节点操作

ref

(1)字符串

可以给子组件设置一个ref属性,然后可以通过this.refs.属性名来获取/设置子组件中的数据。

<Song ref="mySong"></Song>

可以通过this.refs.mySong来获取到组件。

(2)回调函数

可以给子组件设置一个ref属性,它的属性值不是字符串,而是一个函数(自动执行)。可以把子组件当成参数进行传递,然后就可以对组件中的数据进行获取或者修改。

<Song ref={ (el)=>this.getChild2(el) }></Song>

回调函数的写法不会在this.refs存在子组件。

不推荐直接使用ref,只有万不得已才去使用。

五、模拟表单数据双向绑定

六、初始化项目失败

[图片上传失败...(image-f0df1e-1582630015203)]

解决办法:

在命令行中执行命令:npm cache clean --force 清除缓存

然后再重新执行初始化操作

七、作业

用react实现用户注册、登录界面,点击注册或者登录按钮时获取到用户输入的内容

表格页面

(可以使用bootstrap,样式要好看)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,548评论 1 33
  • 前言 开发一个React应用,更多的是在编写组件,而React组件最小的单位就是React元素,编写组件的最大的好...
    itclanCoder阅读 1,202评论 0 1
  • 目前,react组件有三种写法,分别是es5的createClass写法,es6的class写法,以及statel...
    ZoomFunc阅读 1,871评论 0 1
  • 40、React 什么是React?React 是一个用于构建用户界面的框架(采用的是MVC模式):集中处理VIE...
    萌妹撒阅读 1,091评论 0 1
  • 『咚。 有文化和有知识应该是两码事。 大多数时候,对于我来说,知识只是用来攻击无知的武器而已,用来体现自身的优越工...
    绵花不白阅读 298评论 0 0