React子组件

Posted ceceliahappycoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React子组件相关的知识,希望对你有一定的参考价值。

在同一文件下定义子组件

import React from ‘react‘;

class ShowInput extends React.Component {
    constructor () {
        super();
        this.state = {
            txt: ‘this is the txt state.‘,
            title: ‘this state is not change‘
        }
    }
    update (e) {
        this.setState({
            txt: e.target.value
        })
    }
    render () {
        return (
            <div>
                <p></p>
                <Widge update={this.update.bind(this)}/>
                <p>{this.state.title} - { this.state.txt }</p>
            </div>
        )
    }
}

const Widge = (props) => 
    <input type=‘text‘ onChange={props.update}/>

export default ShowInput

注意:自定义组件首字母必须大写。

这里是以函数表达式的方式定义子组件的。

二、使用props.children访问嵌套数据

import React from ‘react‘;

class Button extends React.Component {
    render () {
        return (
            <Element>I <Like /> React</Element>
        )
    }
}
const Element = (props) => 
    <button>{ props.children }</button>

class Like extends React.Component {
    render () {
        return (
            <span> &hearts; </span>
        )
    }
}

export default Button;

通过props.children不仅拿到了自身的文本,而且拿到了<Like>中的内容。

三、自定义propTypes验证子组件props

import React from ‘react‘;

class Check extends React.Component {
    render () {
        return (
            <Title />
        )
    }
}

const Title = (props) => 
    <h2>the Title: { props.title }</h2>

Title.propTypes = {
    title(props, propName,component) {
        // 验证是否为空
        if (!(propName in props)) {
            return new Error(`missing ${propName}`)
        }
        // 验证属性值的长度
        if (props[propName].length < 6) {
            return new Error(`the ${propName} is too short.`)
        }
    }
}

export default Check

 技术图片

 对代码做如下修改:

技术图片

 即可消除报错信息。

 

2. 类型校验

技术图片

 

 上述代码运行后会报错

技术图片

 

 代码修改:

技术图片

 

 报错消失。

 

四、默认props值 defaultProps

技术图片

 

 上述代码不会产生报错,因为设置了defaultProps.

 

五、ref获取特定组件的引用

下面定义了两个span,想要分别对应两个不同的<input />标签中的内容。

import React from ‘react‘;
import ReactDOM from ‘react-dom‘

class Twins extends React.Component {
    constructor () {
        super();
        this.state = {
            a: ‘‘,
            b: ‘‘
        }
    }
    update (e) {
        this.setState({
            a: ReactDOM.findDOMNode(this.a).value,
            b: ReactDOM.findDOMNode(this.b).value
        })
    }

    render () {
        return (
            <div>
                <Input
                ref={component => this.a = component}
                update={this.update.bind(this)} />
                <span>{this.state.a}</span> 
                <hr></hr>
                <Input
                ref={component => this.b = component}
                update={this.update.bind(this)} />
                <span>{this.state.b}</span>
            </div>
        )
    }
}

class Input extends React.Component {
    render () {
        return (
            <input type=‘text‘ onChange={this.props.update} />
        )
    }
}
export default Twins

注意:这里Input一定要以class形式定义。

以上是关于React子组件的主要内容,如果未能解决你的问题,请参考以下文章

Reactreact概述组件事件

react 父组件怎么调用子组件的方法

react用了固定定位之后子组件不能滚动了

前端:react生命周期

react-插槽(Portals)

将状态传递给 React/Redux 中的递归嵌套组件