React 에서이 세 점은 무엇을합니까?


897

...이 React (JSX 사용) 코드에서 수행하는 작업은 무엇입니까 ?

<Modal {...this.props} title='Modal heading' animation={false}>

6
스프레드 구문에 대한 간단하고 이해하기 쉬운 읽기가 있습니다 -codeburst.io/javascript-es6-the-spread-syntax-f5c35525f754
Gautam

5
참고 : ...연산자는 상황에 따라 다르게 작동합니다. 이와 관련하여 아래에 @TJ Crowder가 설명하는 "확산"연산자가 있습니다. 다른 맥락에서 이것은 아래 @Tomas Nikodym에 의해 설명 된 "휴식"연산자 일 수도 있습니다.
doub1ejack

답변:


1064

이것이 속성 스프레드 표기법 입니다. ES2018에 추가되었지만 (배열 / 이터 블에 대한 확산은 ES2015 이전), Transpilation을 통해 오랫동안 React 프로젝트에서 지원되었습니다 ( " JSX 스프레드 속성 " 으로 속성 뿐만 아니라 다른 곳에서도 수행 할 수 있음) ).

{...this.props} 밖으로 스프레드 에서 "자신의"열거 속성 props상의 개별 속성으로 Modal당신이 만드는 요소입니다. 예를 들어, 경우는 this.props포함 a: 1하고 b: 2다음,

<Modal {...this.props} title='Modal heading' animation={false}>

~와 같을 것이다

<Modal a={this.props.a} b={this.props.b} title='Modal heading' animation={false}>

그러나 동적이므로 "자체"속성 props이 포함됩니다.

이후 children에 "자신의"속성입니다 props, 스프레드가 포함됩니다. 따라서 이것이 나타나는 구성 요소에 자식 요소가 있으면에 전달됩니다 Modal. 여는 태그와 닫는 태그 사이에 자식 요소를 넣는 것은 시작 태그에 children속성 을 넣는 데 좋은 구문 설탕 입니다. 예:

스프레드 표기법은 해당 사용 사례뿐만 아니라 기존 객체의 속성 중 대부분 (또는 전체)으로 새 객체를 만드는 데 유용합니다. 상태를 수정할 수 없으므로 상태를 업데이트 할 때 많이 나타납니다. 직접:

this.setState(prevState => {
    return {foo: {...prevState.foo, a: "updated"}};
});

this.state.foo속성을 foo제외한 모든 속성이 동일한 새 객체로 대체 a됩니다 "updated".


1
여는 태그와 닫는 태그 사이에 자식 요소를 배치 하면 속성이 무시children 되거나 결합됩니까?
anddero

3
@anddero-매우 흥미로운 질문입니다. 내가 볼 수있는 한, [의 문서다루지 않습니다children . 실험에 따르면 속성을 통해 제공하는 하위 항목 children은 시작 태그와 종료 태그 사이에 지정한 속성 으로 대체되지만 정의되지 않은 동작 인 경우에는 의존하지 않을 것입니다.
TJ Crowder 2019

332

아시다시피 ...라고 확산 속성 이름은 식 확장 할 수 있습니다 나타냅니다.

var parts = ['two', 'three'];
var numbers = ['one', ...parts, 'four', 'five']; // ["one", "two", "three", "four", "five"]

그리고이 경우에는 단순화하겠습니다.

//just assume we have an object like this:
var person= {
    name: 'Alex',
    age: 35 
}

이:

<Modal {...person} title='Modal heading' animation={false} />

동일하다

<Modal name={person.name} age={person.age} title='Modal heading' animation={false} />

간단히 말해 깔끔한 지름길 이라고 할 수 있습니다 .


155

세 개의 점은 ES6 의 스프레드 연산자 를 나타냅니다 . Javascript에서 몇 가지 작업을 수행 할 수 있습니다.

  1. 배열 연결

    var shooterGames = ['Call of Duty', 'Far Cry', 'Resident Evil'];
    var racingGames = ['Need For Speed', 'Gran Turismo', 'Burnout'];
    var games = [...shooterGames, ...racingGames];
    
    console.log(games)  // ['Call of Duty', 'Far Cry', 'Resident Evil',  'Need For Speed', 'Gran Turismo', 'Burnout']
  2. 배열 해체

      var shooterGames = ['Call of Duty', 'Far Cry', 'Resident Evil'];
      var [first, ...remaining] = shooterGames;
      console.log(first); //Call of Duty
      console.log(remaining); //['Far Cry', 'Resident Evil']
  3. 두 객체 결합

    var myCrush = {
      firstname: 'Selena',
      middlename: 'Marie'
    };
    
    var lastname = 'my last name';
    
    var myWife = {
      ...myCrush,
      lastname
    }
    
    console.log(myWife); // {firstname: 'Selena',
                         //   middlename: 'Marie',
                         //   lastname: 'my last name'}

나머지 매개 변수 라고하는 3 개의 점에 대한 또 다른 용도가 있으며 모든 인수를 하나의 배열로 함수에 사용할 수 있습니다.

  1. 배열로서의 함수 인수

     function fun1(...params) { 
    
     }  

36
이것은 각 사용 사례에 대한 모든 명확한 예 때문에 큰 대답입니다. 이 모든 것을 적어 주셔서 감사합니다.
차드

2
더 명확하게하기 위해 예제 앞에 언급 된 나머지 매개 변수
j obe

2
upvoted, 이것은 내가 찾던 것입니다
Csaba

2
솔직히 이것은 대답이 받아 들여 져야합니다. +1
I_am_learning_now 18:32에

1
또한뿐만 아니라 가장 좋은 대답 가장 재미 하나, 'Selana 마리 첫 번째 호감 : D'
Andaç Temel

56

JavaScript의 세 점은 스프레드 / 휴식 연산자 입니다.

스프레드 연산자

확산 구문은 표현식이 여러 인수가 예상되는 장소에서 확장 할 수 있습니다.

myFunction(...iterableObj);

[...iterableObj, 4, 5, 6]

[...Array(10)]

나머지 매개 변수

나머지 파라미터 구문 인수 가변 수의 기능을 위해 사용된다.

function(a, b, ...theArgs) {
  // ...
}

ES6에서는 어레이의 스프레드 / 휴식 연산자가 도입되었습니다. 객체 확산 / 휴식 특성에 대한 State 2 제안 이 있습니다.

TypeScript는 또한 확산 구문을 지원하며 사소한 문제가있는 이전 버전의 ECMAScript로 변환 할 수 있습니다 .


스프레드 / 휴식이 이제 Stage4로 완료되었습니다. ES9 / 2018 github.com/tc39/proposal-object-rest-spread/blob/master/…에
SeanMC

32

이것은 ES6의 기능으로 React에서도 사용됩니다. 아래 예를보십시오.

function Sum(x,y,z) {
   return x + y + z;
}
console.log(Sum(1,2,3)); //6

최대 3 개의 매개 변수가있는 경우이 방법이 좋습니다. 그러나 예를 들어 110 개의 매개 변수를 추가해야하는 경우 모두 정의하고 하나씩 추가해야합니까?

물론 SPREAD 라는 쉬운 방법이 있습니다. 모든 매개 변수를 전달하는 대신 다음을 작성하십시오.

function (...numbers){} 

우리는 우리가 얼마나 많은 매개 변수를 가지고 있는지 모릅니다. ES6을 기반으로 위의 함수를 아래와 같이 다시 작성하고 이들 사이의 스프레드와 매핑을 사용하여 케이크 한 조각처럼 쉽게 만들 수 있습니다.

let Sum = (...numbers) => {
return numbers.reduce((prev, current) => prev + current );
}
console.log(Sum(1, 2, 3, 4, 5, 6, 7, 8, 9));//45

17

JSX 에서 다른 방법으로 소품 을 정의하는 것입니다!

...ES6에서 배열 및 객체 연산자를 사용 하고 있습니다 (아직 완전히 지원되지 않은 객체 1). 따라서 소품을 이미 정의한 경우이 방법으로 요소에 전달할 수 있습니다.

따라서 귀하의 경우 코드는 다음과 같아야합니다.

function yourA() {
  const props = {name='Alireza', age='35'};
  <Modal {...props} title='Modal heading' animation={false} />
}

이제 정의한 소품이 분리되어 필요한 경우 재사용 할 수 있습니다.

다음과 같습니다.

function yourA() {
  <Modal name='Alireza' age='35' title='Modal heading' animation={false} />
}

다음은 JSX의 스프레드 연산자에 대한 React 팀의 인용문입니다.

JSX 스프레드 속성 구성 요소에 미리 배치하려는 모든 속성을 알고 있으면 JSX를 사용하기 쉽습니다.

var component = <Component foo={x} bar={y} />;

소품 변경이 잘못
되었습니다. 설정하려는 속성을 모르는 경우 나중에 객체에 추가하려는 유혹이있을 수 있습니다.

var component = <Component />;
component.props.foo = x; // bad
component.props.bar = y; // also bad

이것은 안티 패턴입니다. 나중에 올바른 propTypes를 확인할 수 없다는 의미이기 때문입니다. 이는 propTypes 오류가 암호화 스택 추적으로 끝나는 것을 의미합니다.

소품은 불변으로 간주해야합니다. props 객체를 다른 곳에서 변경하면 예기치 않은 결과가 발생할 수 있으므로 이상적으로는이 시점에서 고정 된 객체가됩니다.

스프레드 속성
이제 스프레드 속성 이라는 새로운 JSX 기능을 사용할 수 있습니다.

var props = {};
    props.foo = x;
    props.bar = y;
    var component = <Component {...props} />;

전달한 객체의 속성이 구성 요소의 소품에 복사됩니다.

이를 여러 번 사용하거나 다른 속성과 결합 할 수 있습니다. 사양 순서가 중요합니다. 이후의 속성은 이전의 속성보다 우선합니다.

var props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'

이상한 ... 표기법은 무엇입니까?
... 연산자 (또는 스프레드 연산자)는 이미 ES6의 어레이에 대해 지원됩니다. Object Rest 및 Spread Properties에 대한 ECMAScript 제안도 있습니다. JSX에서보다 명확한 구문을 제공하기 위해 이러한 지원 및 개발 표준을 활용하고 있습니다.


15

파이썬 세계에서 온 사람들의 경우 JSX Spread Attributes는 Unpacking Argument Lists (Python- **operator)와 같습니다.

나는 이것이 JSX 질문이라는 것을 알고 있지만 유추 작업을하면 때로는 더 빨리 얻는 데 도움이됩니다.


10

...반응로 (확산 연산자)를 사용한다 :

소품을 부모에서 자식 구성 요소로 전달하는 깔끔한 방법을 제공합니다. 예를 들어 부모 구성 요소에 이러한 소품이 있으면

this.props = {
  username: "danM",
  email: "dan@mail.com"
}

그들은 다음과 같은 방식으로 아이에게 전달 될 수있었습니다.

<ChildComponent {...this.props} />

이것과 비슷합니다

<ChildComponent username={this.props.username} email={this.props.email} />

그러나 더 깨끗합니다.


9

3 개의 점 ...스프레드 연산자 또는 나머지 매개 변수를 나타냅니다 .

배열 표현식이나 문자열 또는 반복 할 수있는 모든 것이 함수 호출 또는 배열 요소가 0 개 이상의 인수가 필요한 위치에서 확장 될 수 있습니다 .

  • 두 배열 병합

var arr1 = [1,2,3];
var arr2 = [4,5,6];

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

  • 배열 복사 :

var arr = [1, 2, 3];
var arr2 = [...arr];

console.log(arr); //[1, 2, 3]

참고 : 확산 구문은 배열을 복사하는 동안 효과적으로 한 수준 깊게 진행됩니다. 따라서 다음 예제와 같이 다차원 배열을 복사하는 데 적합하지 않을 수 있습니다 (Object.assign () 및 스프레드 구문과 동일 함).

  • 특정 인덱스에서 한 배열의 값을 다른 인덱스에 추가하십시오 (예 : 3).

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

  • new로 생성자를 호출 할 때 :

var dateFields = [1970, 0, 1];  // 1 Jan 1970
var d = new Date(...dateFields);

console.log(d);

  • 객체 리터럴에 퍼짐 :

var obj1 = { foo: 'bar', x: 42 };
var obj2 = { foo: 'baz', y: 13 };

var clonedObj = { ...obj1 };
console.log(clonedObj);	//{foo: "bar", x: 42}

var mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj);	//{foo: "baz", x: 42, y: 13}

참고 foo으로 obj1의 속성은 obj2보다가 덮어 쓴 foo특성

  • 무한한 수의 인수를 배열로 나타낼 수있는 나머지 매개 변수 구문으로 :

function sum(...theArgs) {
  return theArgs.reduce((previous, current) => {
    return previous + current;
  });
}

console.log(sum(1, 2, 3));	//6
console.log(sum(1, 2, 3, 4));	//10

참고 : 스프레드 구문 (확산 속성의 경우 제외)은 반복 가능한 객체에만 적용 할 수 있습니다. 따라서 다음과 같은 오류가 발생합니다

var obj = {'key1': 'value1'};
var array = [...obj]; // TypeError: obj is not iterable

참조 1

참고 2


5

Brandon Morelli에게 찬사를 보냅니다. 그는 여기 에 완벽하게 설명 했지만 링크가 죽을 수 있으므로 아래 내용을 붙여 넣습니다.

스프레드 구문은 단순히 3 개의 점입니다. 0 개 이상의 ... 인수가 예상되는 곳에서 iterable을 확장 할 수 있습니다. 문맥이 없으면 정의가 어렵습니다. 이것이 의미하는 바를 이해하는 데 도움이되는 몇 가지 사용 사례를 살펴 보겠습니다.

예제 # 1 — 배열 삽입 아래 코드를 살펴보십시오. 이 코드에서는 스프레드 구문을 사용하지 않습니다.

var mid = [3, 4];
var arr = [1, 2, mid, 5, 6];

console.log(arr);

위에서라는 배열을 만들었습니다 mid. 그런 다음 배열을 포함하는 두 번째 배열을 만듭니다 mid. 마지막으로 결과를 로그 아웃합니다. 무엇 arr을 인쇄 하시겠습니까? 어떻게되는지 보려면 위의 실행을 클릭하십시오. 출력은 다음과 같습니다.

[1, 2, [3, 4], 5, 6]

그 결과가 예상 되었습니까? mid배열을 배열에 삽입함으로써 배열 안에 arr배열이 생겼습니다. 그것이 목표라면 괜찮습니다. 그러나 1에서 6까지의 값을 가진 단일 배열 만 원한다면 어떻게해야합니까? 이를 위해 스프레드 구문을 사용할 수 있습니다! 스프레드 구문을 사용하면 배열 요소를 확장 할 수 있습니다. 아래 코드를 보자. 스프레드 구문을 사용하여 mid배열을 배열에 삽입한다는 점을 제외하면 모든 것이 동일합니다 arr.

var mid = [3, 4];
var arr = [1, 2, ...mid, 5, 6];

console.log(arr);

실행 버튼을 누르면 결과는 다음과 같습니다.

[1, 2, 3, 4, 5, 6]

대박! 위에서 읽은 스프레드 구문 정의를 기억하십니까? 여기가 시작됩니다. 보시다시피, arr배열 을 만들고 배열에 스프레드 연산자를 사용하면 mid배열을 삽입하는 대신 mid배열이 확장됩니다. 이 확장은 mid어레이의 모든 요소가 어레이에 삽입 됨을 의미합니다 arr. 중첩 배열 대신 결과는 1에서 6까지의 단일 숫자 배열입니다.

Example # 2 — Math JavaScript에는 재미있는 수학 계산을 수행 할 수있는 내장 math 객체가 있습니다. 이 예에서는을 살펴 보겠습니다 Math.max(). 익숙하지 않은 경우 Math.max()0보다 큰 숫자 중 가장 큰 숫자를 반환합니다. 몇 가지 예는 다음과 같습니다.

Math.max();
// -Infinity
Math.max(1, 2, 3);
// 3
Math.max(100, 3, 4);
// 100

보시다시피, 여러 숫자의 최대 값을 찾으 Math.max()려면 여러 개의 매개 변수가 필요합니다. 불행히도 단순히 단일 배열을 입력으로 사용할 수 없습니다. 스프레드 구문 전에 Math.max()배열 에서 사용하는 가장 쉬운 방법 은.apply()

var arr = [2, 4, 8, 6, 0];

function max(arr) {
  return Math.max.apply(null, arr);
}

console.log(max(arr));

작동, 정말 성가시다. 이제 스프레드 구문을 사용하여 동일한 작업을 수행하는 방법을 살펴보십시오.

var arr = [2, 4, 8, 6, 0];
var max = Math.max(...arr);

console.log(max);

함수를 생성하고 apply 메소드를 사용하여의 결과를 반환하는 대신 Math.max()두 줄의 코드 만 필요합니다! 스프레드 구문은 배열 요소를 확장하고 배열의 각 요소를 Math.max()메소드에 개별적으로 입력합니다 !

예제 # 3 — 배열 복사 JavaScript에서는 기존 변수와 동일한 새 변수를 설정하여 배열을 복사 할 수 없습니다. 다음 코드 예제를 고려하십시오.

var arr = ['a', 'b', 'c'];
var arr2 = arr;

console.log(arr2);

run을 누르면 다음과 같은 결과가 나타납니다.

['a', 'b', 'c']

이제 언뜻보기에는 작동하는 것처럼 보입니다. arr의 값을 arr2에 복사 한 것 같습니다. 그러나 그것은 일어나지 않았습니다. 자바 스크립트에서 객체로 작업 할 때 (배열은 객체의 유형) 값이 아니라 참조로 할당합니다. 이는 arr2가 arr과 동일한 참조에 지정되었음을 의미합니다. 즉, arr2에 수행하는 모든 작업은 원래 arr 배열에도 영향을 미칩니다 (그 반대도 마찬가지). 아래를 살펴보십시오.

var arr = ['a', 'b', 'c'];
var arr2 = arr;

arr2.push('d');

console.log(arr);

위에서, 우리는 새로운 요소 d를 arr2에 넣었습니다. 그러나 arr 값을 로그 아웃하면 d 값이 해당 배열에 추가 된 것을 볼 수 있습니다.

['a', 'b', 'c', 'd']

그래도 두려워 할 필요는 없습니다! 스프레드 연산자를 사용할 수 있습니다! 아래 코드를 고려하십시오. 위와 거의 동일합니다. 대신, 대괄호 쌍 안에 스프레드 연산자를 사용했습니다.

var arr = ['a', 'b', 'c'];
var arr2 = [...arr];

console.log(arr2);

적중시 예상 출력이 표시됩니다.

['a', 'b', 'c']

위에서 arr의 배열 값이 확장되어 개별 요소가되어 arr2에 할당되었습니다. 이제 원래 arr 배열에 아무런 영향을 미치지 않고 원하는만큼 arr2 배열을 변경할 수 있습니다.

var arr = ['a', 'b', 'c'];
var arr2 = [...arr];

arr2.push('d');

console.log(arr);

다시, 이것이 작동하는 이유는 arr 값이 확장되어 arr2 배열 정의의 대괄호를 채우기 때문입니다. 따라서 첫 번째 예에서와 같이 arr2를 arr에 대한 참조 대신 arr의 개별 값과 동일하게 설정합니다.

보너스 예제 — 문자열에서 배열 로 재미있는 마지막 예제로, 확산 구문을 사용하여 문자열을 배열로 변환 할 수 있습니다. 대괄호 쌍 안에 스프레드 구문을 사용하면됩니다.

var str = "hello";
var chars = [...str];

console.log(chars);


4

이 3 개의 점 (...)을 스프레드 연산자라고하며 이는 개념적으로 ES6 배열 스프레드 연산자와 유사합니다. JSX는 JSX에서보다 명확한 구문을 제공하기 위해 이러한 지원 및 개발 표준을 활용합니다.

객체 이니셜 라이저의 스프레드 속성은 제공된 객체의 자체 열거 가능 속성을 새로 만든 객체로 복사합니다.

let n = { x, y, ...z };
n; // { x: 1, y: 2, a: 3, b: 4 }

참고:

1) https://github.com/sebmarkbage/ecmascript-rest-spread#spread-properties

2) https://facebook.github.io/react/docs/jsx-spread.html


3
ECMAScript의 객체에 대한 스프레드 연산자 제안입니다. 문제는 JSX 스프레드 연산자에 관한 것입니다. 그들은 같은 방식으로 작동하더라도 동일하지 않습니다.
ivarni

1
@ ivarni 감사합니다. 문맥에 저를 가져 왔습니다. 질문을 바탕으로 답을 업데이트하겠습니다.
개발자

@ivarni, 상황에 따라 답을 업데이트 맥락이 맞는 희망
개발자

"세 개의 점 (...)을 스프레드 연산자라고 합니다. " 잘못되었습니다. :-) 확산 및 휴식은 연산자가 아니며 연산자는 단일 결과 값을 생성해야하므로 불가능합니다. 확산과 휴식은 연산자가 아닌 기본 구문입니다.
TJ Crowder

2

...의 의미는 코드에서 사용하는 위치에 따라 다릅니다.

  1. 배열 / 객체를 확산 / 복사하는 데 사용 - 배열 / 객체 를 복사하고 새로운 배열 값을 추가하거나 객체에 새 속성을 추가하는 데 도움이됩니다 (선택 사항).

const numbers = [1,2,3];
const newNumbers = [...numbers, 4];
console.log(newNumbers) //prints [1,2,3,4] 

const person = {
 name: 'Max'
};

const newPerson = {...person, age:28};
console.log(newPerson); //prints {name:'Max', age:28}

  1. 함수 인수를 단일 배열로 병합하는 데 사용됩니다. 그런 다음 배열 함수를 사용할 수 있습니다.

const filter = (...args) => {
   return args.filter(el => el ===1);
}

console.log(filter(1,2,3)); //prints [1] 


2

이 스프레드 연산자는 ...

예를 들어 배열 first=[1,2,3,4,5]과 다른 배열이있는 경우 second=[6,7,8].

[...first, ...second] //result is [1,2,3,4,5,6,7,8]

json 객체에서도 마찬가지입니다.


2

간단히 말해서 세 점 ...은 ES6 (ES2015)의 스프레드 연산자입니다. 스프레드 연산자는 모든 데이터를 가져옵니다.

let a = [1, 2, 3, 4];
let b = [...a, 4, 5, 6];
let c = [7,8,...a];


console.log(b);

결과를 줄 것이다 [1,2,3,4,5,6]

console.log(c);

결과를 줄 것이다 [7,8,1,2,3,4]


1

일반적으로 스프레드 연산자라고하며 필요한 위치를 확장하는 데 사용됩니다.

const SomeStyle = {
   margin:10,
   background:#somehexa
}

스프레드 연산자 Spread 구문 에 대해 더 필요할 때마다 사용할 수 있습니다 .


1

간단한 방법으로 여러 속성을 전달하는 데 사용되는 확산 속성

{... this.props}는 this.props의 속성을 유지합니다

아래 소품과 함께 {...} 스프레드 연산자 사용

this.props = 
 { 
    firstName: 'Dan', 
    lastName: 'Abramov', 
    city: 'New York',
    country: 'USA' 
}

{...}없이

<Child 
  firstName={this.props.firstName}
  lastName={this.props.lastName}
  city={this.props.city}
  country={this.props.country}

> 

{...} 스프레드

<Child { ...this.props } />

스프레드 연산자에 대한 Dan Abramov의 트윗 (Creator of Redux)


1

...이 구문은 ES6의 일부이며 React에서만 사용할 수있는 것이 아닙니다. 두 가지 다른 방식으로 사용할 수 있습니다. 이 기사에서 자세한 내용을 확인할 수 있습니다 : https://www.techiediaries.com/react-spread-operator-props-setstate/

당신이 질문에서 언급 한 것은 이것과 비슷합니다.

    function HelloUser() {
      return <Hello Name="ABC" City="XYZ" />;
    }

스프레드 연산자를 사용하면 이와 같이 소품을 구성 요소에 전달할 수 있습니다.

     function HelloUser() {
       const props = {Name: 'ABC', City: 'XYZ'};
       return <Hello {...props} />;
     }

0

React 애플리케이션에서 소품을 전달하는 것이 일반적입니다. 이를 통해 순수 또는 불완전 (상태 비 저장 또는 상태 저장)에 관계없이 하위 구성 요소에 상태 변경을 적용 할 수 있습니다. 소품을 전달할 때 가장 좋은 방법은 단일 속성 또는 전체 속성 개체를 전달하는 경우가 있습니다. ES6에서 배열을 지원함으로써 "..."표기법이 주어졌으며 이제 전체 객체를 자식에게 전달할 수있게되었습니다.

소품을 자식에게 전달하는 일반적인 프로세스는 다음 구문으로 표시됩니다.

var component = <Component foo={x} bar={y} />;

소품 수가 적을 때 사용하는 것이 좋지만 소품 수가 너무 많으면 관리 할 수 ​​없게됩니다. 자식 구성 요소에 필요한 속성을 모르는 경우이 메서드의 문제가 발생하며 일반적인 JavaScript 메서드는 해당 속성을 간단하게 설정하고 나중에 개체에 바인딩하는 것입니다. 이로 인해 propType 검사 및 암호화 스택 추적 오류가 도움이되지 않아 디버깅이 지연됩니다. 다음은이 연습의 예이며 수행하지 말아야 할 작업입니다.

var component = <Component />;
component.props.foo = x; // bad
component.props.bar = y;

동일한 결과를 얻을 수 있지만 다음과 같이하면보다 적절한 성공을 거둘 수 있습니다.

var props = {};
props.foo = x;
props.bar = y;
var component = Component(props); // Where did my JSX go?

그러나 JSX 스프레드 또는 JSX를 사용하지 않으므로 이것을 다시 방정식으로 반복하면 다음과 같이 할 수 있습니다.

var props = {};
props.foo = x;
props.bar = y;
var component = <Component {...props} />;

"... props"에 포함 된 속성은 foo : x, bar : y입니다. 이 속성을 다른 속성과 결합하여 다음 구문을 사용하여 "... props"의 속성을 재정의 할 수 있습니다.

var props = { foo: 'default' };
var component = <Component {...props} foo={'override'} />;
console.log(component.props.foo); // 'override'

또한 다른 속성 개체를 서로 복사하거나 다음과 같이 결합 할 수 있습니다.

var oldObj = { foo: 'hello', bar: 'world' };
var newObj = { ...oldObj, foo: 'hi' };
console.log(newObj.foo); // 'hi';
console.log(newObj.bar); // 'world';

또는 다음과 같은 두 개의 다른 객체를 병합하십시오 (모든 반응 버전에서 아직 사용할 수있는 것은 아님).

var ab = { ...a, ...b }; // merge(a, b)

Facebook의 반응 / 문서 사이트에 따르면이를 설명하는 다른 방법은 다음과 같습니다.

객체로 이미 "props"가 있고 JSX에서 전달하려면 "..."을 SPREAD 연산자로 사용하여 전체 props 객체를 전달할 수 있습니다. 다음 두 가지 예는 동일합니다.

function App1() {
  return <Greeting firstName="Ben" lastName="Hector" />;
}



function App2() {
  const props = {firstName: 'Ben', lastName: 'Hector'};
  return <Greeting {...props} />;
}

확산 속성은 일반 컨테이너를 빌드 할 때 유용 할 수 있습니다. 그러나 관심이없는 구성 요소에 관련없는 많은 소품을 쉽게 전달하여 코드를 복잡하게 만들 수도 있습니다. 이 구문은 드물게 사용해야합니다.


0

스프레드 연산자라고합니다. 예를 들어 let hello = {name : '', msg : ''} let hello1 = {... hello} 이제 hello 객체 속성이 hello1에 복사됩니다.


0

이를 자바 스크립트에서 스프레드 구문이라고합니다.

자바 스크립트에서 배열이나 객체를 파괴하는 데 사용됩니다.

예:

const objA = { a: 1, b: 2, c: 3 }
const objB = { ...objA, d: 1 }
/* result of objB will be { a: 1, b: 2, c: 3, d: 1 } */
console.log(objB)

const objC = { ....objA, a: 3 }
/* result of objC will be { a: 3, b: 2, c: 3, d: 1 } */
console.log(objC)

같은 결과를 얻을 수 있습니다 Object.assign()자바 스크립트의 함수로 .

참조 : 확산 구문



0

ecama script 6 (ES6)에 spread operator (triple operator)가 도입되었습니다 .Ecama script (ES6)는 javascript의 래퍼입니다.

소품에 연산자 열거 가능 속성을 확산시킵니다. this.props = {이름 : 'Dan', 성 : 'Abramov', 도시 : 'New York', 국가 : 'USA'}

{... this.props} = {firstName : 'Dan', 성 : 'Abramov', 도시 : 'New York', 국가 : 'USA'}

그러나 주요 기능 스프레드 연산자는 참조 유형에 사용됩니다.

For example
let person= {
    name: 'Alex',
    age: 35 
}
person1= person;

person1.name = "Raheel";

console.log( person.name); // output: Raheel

이것을 참조 유형이라고하며, 한 객체는 메모리에서 공유 할 수 있기 때문에 다른 객체에 영향을줍니다. 독립적으로 값을 얻으려면 스프레드 메모리를 모두 사용하고 스프레드 연산자를 사용하십시오.

 let person= {
        name: 'Alex',
        age: 35 
    }
person2 = {...person};

person2.name = "Shahzad";

console.log(person.name); // output: Alex


0

...(자바 스크립트에서 3 개의 점)를 스프레드 구문 또는 스프레드 연산자라고합니다. 이를 통해 배열 표현식 또는 문자열 과 같은 반복 가능 항목을 확장하거나 오브젝트 표현식을 배치 할 때마다 확장 할 수 있습니다. 이것은 React에만 국한되지 않습니다. 자바 스크립트 연산자입니다.

여기에있는 모든 대답이 도움이되지만 가장 널리 사용되는 Spread Syntax (Spread Operator) 사용 사례를 나열하고 싶습니다 .

1. 배열 결합 (배열 연결)

배열을 결합 하는 다양한 방법이 있지만 스프레드 연산자를 사용하면 배열의 어느 위치 에나 배치 할 수 있습니다. 두 배열을 결합하고 배열 내 임의의 지점에 요소를 배치하려면 다음과 같이하십시오.

var arr1 = ['two', 'three'];
var arr2 = ['one', ...arr1, 'four', 'five'];

// arr2 = ["one", "two", "three", "four", "five"]

2. 배열 복사

배열의 복사본을 원할 때 Array.prototypr.slice () 메서드를 사용했습니다. 그러나 스프레드 연산자를 사용하여 동일한 작업을 수행 할 수 있습니다.

var arr = [1,2,3];
var arr2 = [...arr];
// arr2 = [1,2,3]

3. Apply없이 함수 호출

ES5에서 두 개의 숫자 배열을 doStuff()함수에 전달하려면 종종 다음과 같이 Function.prototype.apply () 메서드를 사용합니다.

function doStuff (x, y, z) { }
var args = [0, 1, 2];

// Call the function, passing args
doStuff.apply(null, args);

그러나 스프레드 연산자를 사용하면 배열을 함수에 전달할 수 있습니다.

doStuff(...args);

4. 배열 정리

파괴와 나머지 연산자를 함께 사용하여 원하는대로 정보를 변수로 추출 할 수 있습니다.

let { x, y, ...z } = { x: 1, y: 2, a: 3, b: 4 };
console.log(x); // 1
console.log(y); // 2
console.log(z); // { a: 3, b: 4 }

5. 나머지 매개 변수로서의 함수 인수

ES6에는 함수의 나머지 모든 인수를 배열로 수집하는 나머지 매개 변수 인 3 개의 점 (...)이 있습니다.

function f(a, b, ...args) {
  console.log(args);
}

f(1,2,3,4,5);
// [ 3, 4, 5 ]

6. 수학 함수 사용

스프레드가 인수로 사용되는 모든 함수는 여러 개의 인수를 허용 할 수있는 함수에서 사용할 수 있습니다.

let numbers = [9, 4, 7, 1];
Math.min(...numbers); // 1

7. 두 객체의 결합

스프레드 연산자를 사용하여 두 객체를 결합 할 수 있습니다. 이것은 쉽고 깔끔한 방법입니다.

var carType = {
  model: 'Toyota',
  yom: '1995'
};

var carFuel = 'Petrol';

var carData = {
  ...carType,
  carFuel
}

console.log(carData); 
// {
//  model: 'Toyota',
//  yom: '1995',
//  carFuel = 'Petrol'
// }

8. 문자열을 별도의 문자로 분리

spread 연산자를 사용하여 문자열을 별도의 문자로 펼칠 수 있습니다.

let chars = ['A', ...'BC', 'D'];
console.log(chars); // ["A", "B", "C", "D"]

스프레드 연산자를 사용하는 더 많은 방법을 생각할 수 있습니다. 내가 여기에 나열한 것은 널리 사용되는 사례입니다.


-1

이것은 ES6 / Harmony의 새로운 기능입니다. 이것을 스프레드 연산자라고합니다. 배열 / 객체의 구성 부분을 분리하거나 여러 항목 / 매개 변수를 가져 와서 서로 붙일 수 있습니다. 예를 들면 다음과 같습니다.

let array = [1,2,3]
let array2 = [...array]
// array2 is now filled with the items from array

그리고 객체 / 키로 :

// lets pass an object as props to a react component
let myParameters = {myKey: 5, myOtherKey: 7}
let component = <MyComponent {...myParameters}/>
// this is equal to <MyComponent myKey=5 myOtherKey=7 />

정말 멋진 점은 "나머지 값"을 의미하는 데 사용할 수 있다는 것입니다.

const myFunc = (value1, value2, ...values) {
    // Some code
}

myFunc(1, 2, 3, 4, 5)
// when myFunc is called, the rest of the variables are placed into the "values" array

-3

이를 스프레드라고합니다. 이름에서 알 수 있듯이 그것은 그 배열이나 객체에 그 값을 넣는 것을 의미합니다.

같은 :

let a = [1, 2, 3];
let b = [...a, 4, 5, 6];
console.log(b);
> [1, 2, 3, 4, 5, 6]
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.