Co jsou tři tečky (...) neboli operátor rozšíření v Reactu

04.09.2023 Programování #react

Syntaxe spread (...) umožňuje, aby byl iterovatelný prvek, jako je pole nebo řetězec, expandován v místech, kde se očekává nula nebo více argumentů (pro volání funkcí) nebo prvků (pro literály pole). V objektovém literálu syntaxe spreadu vytvoří výčet vlastností objektu a přidá páry klíč-hodnota k vytvářenému objektu.


Možná jste často viděli kód v Reactu, kde použili tři tečky ( ...) před proměnnou, jak je znázorněno níže:

<Component {...props} />

Tyto se v JavaScriptu nazývají operátory spreadů a v tomto článku uvidíme různé případy použití toho, jak lze operátory spreadů použít v React a JavaScript.

Předávání rekvizit pomocí operátoru šíření

Řekněme, že máte nazvanou komponentu Person a chcete předat tři různé vlastnosti, firstNamelastName age. Tradičně bychom je předali, jak je uvedeno níže:

import React from "react"

export const Person = () => {
  const { firstName, lastName, age } = person
  return (
    <div>
      <p>
        Name :{firstName} {lastName}
      </p>
      <p>Age :{age}</p>
    </div>
  )
}

const App = () => {
  const person = { firstName: "John", lastName: "Doe", age: 32 }
  return (
    <Person
      firstName={person.firstName}
      lastName={person.lastName}
      age={person.age}
    />
  )
}

export default App

Všimněte si, že ke každé vlastnosti budeme přistupovat a zapisovat jednotlivě. S rostoucím počtem vlastností se kód stává objemným. Zde můžeme použít operátor spread k předání všech vlastností uvnitř objektu osoby, jak je znázorněno níže:

import React from "react"

export const Person = () => {
  const { firstName, lastName, age } = person
  return (
    <div>
      <p>
        Name :{firstName} {lastName}
      </p>
      <p>Age :{age}</p>
    </div>
  )
}

const App = () => {
  const person = { firstName: "John", lastName: "Doe", age: 32 }
  return <Person {...person} />
}

export default App

Pole a operátor rozšíření

Operátor rozprostření lze také použít k provádění různých operací pole

Vytvoření kopie pole

Položky pro pole můžeme zkopírovat do jiného pole pomocí operátoru spread, jak je znázorněno níže:

const arr1 = [1, 2, 3]
const arr2 = [...arr1]
arr2[2] = 4
console.log(arr1) // [1, 2, 3]
console.log(arr2) // [1, 2, 4]

Všimněte si, že původní pole nebude ovlivněno, když upravíme kopii pole. Všimněte si také, že provádí mělkou kopii, to znamená, že kopíruje pouze položky na nejvyšší úrovni podle hodnoty a všechny vnořené vlastnosti budou zkopírovány odkazem.

Kombinace 2 polí

Můžeme zkombinovat 2 pole a vytvořit nové pole, jak je uvedeno níže, pomocí operátorů spread:

const arr1 = [1, 2, 3]
const arr2 = [4, 5, 6]
const arr3 = [...arr1, ...arr2]
console.log(arr3) // [1, 2, 3, 4, 5, 6]

Přidávání položek do pole

Při kopírování pole můžeme přidat prvek na začátek nebo na konec:

const arr1 = [1, 2, 3]
const arr2 = [0, ...arr1]
const arr3 = [...arr1, 4]
console.log(arr2) // [0, 1, 2, 3]
console.log(arr3) // [1, 2, 3, 4]

Předávání polí funkci

K předání pole funkci jako samostatných argumentů můžeme použít operátor spread:

const sum = (a, b, c) => {
  return a + b + c
}

const arr1 = [1, 2, 3]

sum(...arr1)

Operátor spread pro operace s objektem

Nyní se podívejme na různé operace s objekty, které lze provádět pomocí operátoru spread.

Kopírování položek objektu

Podobně jako u polí můžeme vytvořit mělkou kopii objektu:

const obj1 = { firstName: "John", lastName: "Doe", age: 32 }
const person = { ...obj1 }
console.log(person) // {firstName: 'John', lastName: 'Doe', age: 32}

Spojení 2 objektů

Podobně jako u polí můžeme kombinovat 2 objekty, jak je uvedeno níže:

const obj1 = { firstName: "John" }
const obj2 = { lastName: "Doe", age: 32 }
const person = { ...obj1, ...obj2 }
console.log(person) // {firstName: 'John', lastName: 'Doe', age: 32}

Pokud je stejná vlastnost přítomna v obou objektech, pak vlastnost levého objektu bude ve vytvořené kopii nahrazena vlastností pravého objektu.

Přidání rekvizity při kopírování objektu

Při kopírování objektu můžeme přidat další vlastnosti:

const obj1 = { firstName: "John", lastName: "Doe" }
const person = { ...obj1, age: 32, profession: "Full Stack Developer" }
console.log(person) // {firstName: 'John', lastName: 'Doe', age: 32, profession: 'Full Stack Developer'}

Aktualizace stávajících vlastností objektu

Podobně jako u přidávání rekvizit můžeme také aktualizovat stávající vlastnosti:

const obj1 = {
  firstName: "John",
  lastName: "Doe",
  age: 32,
  profession: "Full Stack Developer",
}
const person = { ...obj1, age: 33 }
console.log(person) //{firstName: 'John', lastName: 'Doe', age: 33, profession: 'Full Stack Developer'}