reactjs中的三点(...)实例|Spread操作符

406 阅读3分钟

这是一个关于 reactjs 和 JSX 中三个点(...)的简单例子。

反应中的三点指定从反应组件层次中传递对象属性。 它还更新反应应用程序中的嵌套json对象。

三点(...)在javascript中也称为spread attributespread syntax

它是作为ES6的一部分引入的。你可以查看我之前关于 "Spreadoperator "的教程。

三个点有什么作用?

它允许扩展对象的可枚举属性,这意味着数组表达式或字符串或对象属性是可枚举属性。

让我们看一个简单的例子,看看它是如何扩展可枚举属性的。

var data = ['3', '4','5'];
var numbers = ['1', ...data, '6', '7']; // ["1", "3", "4", "5", "6","7"]

在上面的例子中,数据包含了多个可枚举的属性。 为了将这些数字添加到另一个数组之间,展开运算符放置,结果是将多个属性复制到结果。

这有助于传递至少0个参数,即动态属性。

反应组件是如何使用三个点的?

var employee= {
    name: 'Franc',
    id: 1,
    salary:5000
}

这些数据如何作为道具从父组件转移到子组件。

如果有一个更大的属性集来传递一个对象给react组件,那怎么办。

<Person name={employee.name} id={employee.id} salary={employee.salary}/>

这看起来不是一个干净的传递方式。

同样的,用spread operator syntax 来重写上面的内容。

<Employee {...employee}>

这是一种干净的从一个组件传递数据到另一个组件的方式。

反应钩子中的三个点的例子

这个传播操作符在react hooks中被用来更新状态对象。

React状态对象是用默认的对象属性初始化的,使用useState对象 useState对象返回初始状态和更新状态的函数。

在更新状态时,传播操作符用新值复制原始数据。它将只更新没有改变的属性。

const [employee, setEmployee] = useState({
    id: '',
    name: '',
    salary: ''
});

 setEmployees([
            ...employees,
            {
                name: "John",
                id:"10",
                salary:"5000"
            }
        ]);

下面是一个完整的例子。

import React, { useState } from 'react';

function HookSpreadArray(props) {
    const [employe, setEmploye] = useState([]);
    const [name, setName] = useState("");

    const saveEmploye = event => {
        event.preventDefault();
        setEmploye([
            ...employe,
            {
                name: name
            }
        ]);
        setName("");
    };

    return (
        <div>
            <>
                <form onSubmit={saveEmploye}>

                    <label>Name
                        <input
                            name="name"
                            type="text"
                            value={name}
                            onChange={e => setName(e.target.value)}
                        />
                    </label>
                    <button name="Save" value="Save">Save</button>
                </form>
                <ul>
                    {employe.map(emp => (
                        <li key={emp.empid}>{emp.name}</li>
                    ))}
                </ul>
            </>
        </div>
    );
}

export default HookSpreadArray;

反应状态中的传播操作符

用于改变反应状态属性的传播操作符 让我们在构造函数中声明状态,如下所示。

    this.state = { name: "Fran" }

可以使用带有对象参数的setState方法来更新状态。

第一种方式,用简单的语法

this.setState({name: "kiran"})

第二种,同样可以用传播操作符或三点式的语法实现

    this.setState({ ...this.state, name: "kiran" })
)

正如你所看到的,将现有的状态与一个新的对象合并,将......传给这个对象,状态将做一个浅层的合并,变成一个新的状态。

这两种方法都很有帮助,而且做的也一样,但是当你在状态树中有一个嵌套对象时,第一种语法就很难了。

例如,嵌套对象在状态对象中被初始化了

state = {
    id:1,
    name:"John",
    dept:{
        name:"Sales"
    }
}

你如何更新反应状态中的嵌套json对象?

例如,你想把dept.中的名字更新为新值,即dept:{name: "Support"}。

使用状态对象中的三个点,你可以轻松地更新

this.setState({ dept: {
  ...this.state.dept,
  name: 'support'
}})