react笔记六 Refs及要点总结

Refs

Refs可以用来绑定到 render() 输出的任何组件上。这个特殊的属性允许你引用 render() 返回的相应的支撑实例( backing instance )。这样就可以确保在任何时间总是拿到正确的实例。

import React from 'react'

class RefsDemo extends React.Component {
    constructor(props) {
        super(props);
        this.state = { a: '', b: '', c: '' };
    }

    handleUp = (event) => {
        console.log(this.refs);
        console.log(this.refs.a.name);
        console.log(this.refs.b.name);
        console.log(this.refs.c.name);

        this.setState({
            a: 'a',
            b: 'b',
            c: 'c'
        })
    }

    render() {
        return (
            <div>
                <input type="text" name="fisrt" value={this.state.a} ref="a"></input>
                <input type="text" name="second" value={this.state.b} ref="b"></input>
                <input type="text" name="third" value={this.state.c} ref="c"></input>
                <input type="button" value="更新值" onClick={this.handleUp}></input>
            </div>
        );
    }
}

export default RefsDemo;

运行:

如果有像个元素有相同的属性,他们在执行事件的时候,他们会做相同的操作,修改代码运行可验证

import React from 'react'

class RefsDemo extends React.Component {
    constructor(props) {
        super(props);
        this.state = { a: '', b: '', c: '' };
    }

    handleUp = (event) => {
        console.log(this.refs);
        console.log(this.refs.a.name);
        console.log(this.refs.b.name);
        console.log(this.refs.c.name);

        this.setState({
            a: 'a',
            b: 'b',
            c: 'c'
        })
    }

    render() {
        return (
            <div>
                <input type="text" name="fisrt" value={this.state.a} ref="a"></input>
                <input type="text" name="second" value={this.state.b} ref="b"></input>
                <input type="text" name="third" value={this.state.c} ref="c"></input>
                <input type="text" name="third" value={this.state.c} ref="c"></input>
                <input type="button" value="更新值" onClick={this.handleUp}></input>
            </div>
        );
    }
}

export default RefsDemo;

要点总结

1.react元素都是不可变的。当元素创建后无法改变其内容或者属性。目前更新界面的唯一变法是创建一个新元素,然后传入ReactDom.render()方法。

2.react只会更新必要的部分。react dom首先会比较内容元素内容先后的不同,而在渲染过程中只会更新改变了的部分。

3.jsx可以使用javascript表达式和注释,两者都需要写在花括号中,但是不能使用ifelse语句,可使用三元运算符来代替。(jsx就是javascript)

4.react使用组建的时候,自定义组建必须以大写字母开头,组建类只能包含一个顶层标签,添加属性时,class要写成className,for要写成htmlFor,因为这两个是javascript保留字。

5.挂载和卸载--->定时器被生成和清除

6.react数据单项流动,组建独立

7.react中state和props区别在于state是根据用户交互来改变,props是不可变的。

8.react中props验证器列表( React.PropTypes 在 React v15.5 版本后已经移到了 prop-types 库。)

MyComponent.propTypes = { 

// 可以声明 prop 为指定的 JS 基本数据类型,默认情况,这些数据是可选的 

optionalArray: React.PropTypes.array, 

optionalBool: React.PropTypes.bool, 

optionalFunc: React.PropTypes.func, 

optionalNumber: React.PropTypes.number, 

optionalObject: React.PropTypes.object,

optionalString: React.PropTypes.string, 

// 可以被渲染的对象 numbers, strings, elements 或 array 

optionalNode: React.PropTypes.node, 

// React 元素 

optionalElement: React.PropTypes.element, 

// 用 JS 的 instanceof 操作符声明 prop 为类的实例。 

optionalMessage: React.PropTypes.instanceOf(Message),

// 用 enum 来限制 prop 只接受指定的值。 

optionalEnum: React.PropTypes.oneOf(['News', 'Photos']), 

// 可以是多个对象类型中的一个 

optionalUnion: React.PropTypes.oneOfType([ React.PropTypes.string, React.PropTypes.number, React.PropTypes.instanceOf(Message) ]), 

// 指定类型组成的数组 

optionalArrayOf: React.PropTypes.arrayOf(React.PropTypes.number), 

// 指定类型的属性构成的对象 

optionalObjectOf: React.PropTypes.objectOf(React.PropTypes.number), 

// 特定 shape 参数的对象 

optionalObjectWithShape: React.PropTypes.shape({ color: React.PropTypes.string, fontSize: React.PropTypes.number }), 

// 任意类型加上 `isRequired` 来使 prop 不可空。 

requiredFunc: React.PropTypes.func.isRequired, 

// 不可空的任意类型 

requiredAny: React.PropTypes.any.isRequired, 

// 自定义验证器。如果验证失败需要返回一个 Error 对象。不要直接使用 `console.warn` 或抛异常,因为这样 `oneOfType` 会失效。 

customProp: function(props, propName, componentName) { 

if (!/matchme/.test(props[propName])) {

return new Error('Validation failed!'); } } } }

9.react事件采用驼峰命名法,事件必须在构造函数中绑定才能在构造函数中通过this去访问相关属性。通常有两种解决方式1.属性初始化语法.2.在回调函数中使用箭头函数(通常不建议使用这种方式绑定,当这个回掉函数作为属性值传入低阶组件,这些组件可能进行额外的重新渲染,当避免这类性能问题)。

10.react事件传入参数,参数放在event前面,回掉函数参数放在event后面,绑定方式回调函数处使用 bind或者箭头函数

运算符&& ---在javascript中 true && expression 总是返回expression, false&&expression总是返回false。

11.阻止组建渲染返回null即可实现,返回null并不会影响该组件生命周期方法的回掉。初始化数据简单的说就是清理残余数据。

13. 如果列表可以进行重新排序,不建议使用索引进行排序,因为这样会导致渲染很慢。

14.key应该保存在组建上,而不是组建中的元素上<=>在map内部调用元素时,切记在每个元素上面加上一个独一无二的key。

15.key在兄弟元素之间应该唯一,并非全局唯一。

16.key会作为给react提示,但不会传递给组建,如果使用和key相同值,将其作为属性传递。

17.jsx中可以出现任何表达式,但是{} 中不能出现var,const,let等这种关键字,表达式之间要用都好隔开。

18.setState是react中事件处理函数中和请求回调函数中触发UI更新的主要方法。

19.replaceState只会宝妞nextState中状态,原state不再nextState中的状态会全部被删除。(replaceProps同理)

20.forceUpdate(强制更新)应当少使用,尽量通过设置状态或者属性并由react触发render()调用。

21.如果组建以及挂载到dom中,findDomNode本地浏览器dom中的元素,如果组建返回null或者false,那么该方法也返回null。

22.isMounted(组建挂载状态)可以使用该方法保证setState和forceUpdate在异步场景下调用不会出错。

23. 当使用异步加载数据时,在组件卸载前使用 componentWillUnmount 来取消未完成的请求。

猜你喜欢

转载自blog.csdn.net/zYjmor/article/details/82842593