What do these three dots in React do?

前端 未结 29 2626
不思量自难忘°
不思量自难忘° 2020-11-21 23:53

What does the ... do in this React (using JSX) code and what is it called?



        
相关标签:
29条回答
  • 2020-11-22 00:15

    ... (three dots in Javascript) is called the Spread Syntax or Spread Operator. This allows an iterable such as an array expression or string to be expanded or an object expression to be expanded wherever placed. This is not specific to React. It is a Javascript operator.

    All these answers here are helpful, but I want to list down the mostly used practical Use Cases of the Spread Syntax (Spread Operator).

    1. Combine Arrays (Concatenate Arrays)

    There are a variety of ways to combine arrays, but the spread operator allows you to place this at any place in an array. If you'd like to combine two arrays and place elements at any point within the array, you can do as follows:

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

    2. Copying Arrays

    When we wanted a copy of an array, we used to have the Array.prototypr.slice() method. But, you can do the same with the spread operator.

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

    3. Calling Functions without Apply

    In ES5, to pass an array of two numbers to the doStuff() function, you often use the Function.prototype.apply() method as follows:

    function doStuff (x, y, z) { }
    var args = [0, 1, 2];
    
    // Call the function, passing args
    doStuff.apply(null, args);
    

    However, by using the spread operator, you can pass an array into the function.

    doStuff(...args);
    

    4. Destructuring Arrays

    You can use destructuring and the rest operator together to extract the information into variables as you'd like them:

    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. Function Arguments as Rest Parameters

    ES6 also has the three dots ( ...) which is a rest parameter that collects all remaining arguments of a function into an array.

    function f(a, b, ...args) {
      console.log(args);
    }
    
    f(1,2,3,4,5);
    // [ 3, 4, 5 ]
    

    6. Using Math Functions

    Any function where spread is used as the argument can be used by functions that can accept any number of arguments.

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

    7. Combining Two Objects

    You can use the spread operator to combine two objects. This is an easy and cleaner way to do it.

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

    8. Separate a String into Separate Characters

    You can use the spread operator to spread a string into separate characters.

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

    You can think of more ways to use the Spread Operator. What I have listed here are the popular use cases of it.

    0 讨论(0)
  • 2020-11-22 00:17

    Kudos to Brandon Morelli. He explained perfectly here, but links may die so I am just pasting the content below:

    The spread syntax is simply three dots: ... It allows an iterable to expand in places where 0+ arguments are expected. Definitions are tough without context. Let's explore some different use cases to help understand what this means.

    Example #1 — Inserting Arrays Take a look at the code below. In this code, we don’t use the spread syntax:

    var mid = [3, 4];
    var arr = [1, 2, mid, 5, 6];
    
    console.log(arr);

    Above, we’ve created an array named mid. We then create a second array which contains our mid array. Finally, we log out the result. What do you expect arr to print? Click run above to see what happens. Here is the output:

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

    Is that the result you expected? By inserting the mid array into the arr array, we’ve ended up with an array within an array. That’s fine if that was the goal. But what if you want only a single array with the values of 1 through 6? To accomplish this, we can use the spread syntax! Remember, the spread syntax allows the elements of our array to expand. Lets look at the code below. Everything is the same — except we’re now using the spread syntax to insert the mid array into the arr array:

    var mid = [3, 4];
    var arr = [1, 2, ...mid, 5, 6];
    
    console.log(arr);

    And when you hit the run button, here’s the result:

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

    Awesome! Remember the spread syntax definition you just read above? Here’s where it comes into play. As you can see, when we create the arr array and use the spread operator on the mid array, instead of just being inserted, the mid array expands. This expansion means that each and every element in the mid array is inserted into the arr array. Instead of nested arrays, the result is a single array of numbers ranging from 1 to 6.

    Example #2 — Math JavaScript has a built in math object that allows us to do some fun math calculations. In this example we’ll be looking at Math.max(). If you’re unfamiliar, Math.max() returns the largest of zero or more numbers. Here are a few examples:

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

    As you can see, if you want to find the maximum value of multiple numbers, Math.max() requires multiple parameters. You unfortunately can’t simply use a single array as input. Before the spread syntax, the easiest way to use Math.max() on an array is to use .apply()

    var arr = [2, 4, 8, 6, 0];
    
    function max(arr) {
      return Math.max.apply(null, arr);
    }
    
    console.log(max(arr));

    It works, it’s just really annoying. Now take a look at how we do the same exact thing with the spread syntax:

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

    Instead of having to create a function and utilize the apply method to return the result of Math.max() , we only need two lines of code! The spread syntax expands our array elements and inputs each element in our array individually into the Math.max() method!

    Example #3 — Copy an Array In JavaScript, you can’t just copy an array by setting a new variable equal to already existing array. Consider the following code example:

    var arr = ['a', 'b', 'c'];
    var arr2 = arr;
    
    console.log(arr2);

    When you press run, you’ll get the following output:

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

    Now, at first glance, it looks like it worked — it looks like we’ve copied the values of arr into arr2. But that’s not what has happened. You see, when working with objects in javascript (arrays are a type of object) we assign by reference, not by value. This means that arr2 has been assigned to the same reference as arr. In other words, anything we do to arr2 will also affect the original arr array (and vice versa). Take a look below:

    var arr = ['a', 'b', 'c'];
    var arr2 = arr;
    
    arr2.push('d');
    
    console.log(arr);

    Above, we’ve pushed a new element d into arr2. Yet, when we log out the value of arr, you’ll see that the d value was also added to that array:

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

    No need to fear though! We can use the spread operator! Consider the code below. It’s almost the same as above. Instead though, we’ve used the spread operator within a pair of square brackets:

    var arr = ['a', 'b', 'c'];
    var arr2 = [...arr];
    
    console.log(arr2);

    Hit run, and you’ll see the expected output:

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

    Above, the array values in arr expanded to become individual elements which were then assigned to arr2. We can now change the arr2 array as much as we’d like with no consequences on the original arr array:

    var arr = ['a', 'b', 'c'];
    var arr2 = [...arr];
    
    arr2.push('d');
    
    console.log(arr);

    Again, the reason this works is because the value of arr is expanded to fill the brackets of our arr2 array definition. Thus, we are setting arr2 to equal the individual values of arr instead of the reference to arr like we did in the first example.

    Bonus Example — String to Array As a fun final example, you can use the spread syntax to convert a string into an array. Simply use the spread syntax within a pair of square brackets:

    var str = "hello";
    var chars = [...str];
    
    console.log(chars);

    0 讨论(0)
  • 2020-11-22 00:17

    For someone who wants to understand this simple and fast:

    First of all, this is not a syntax only to react. this is a syntax from ES6 called Spread syntax which iterate(merge, add..etc) array and object. read more about here

    So answer to the question: let's imagine you have this tag:

    <UserTag name="Supun" age="66" gender="male" />

    and You do this:

    const user = {
      "name"=>"Joe",
      "age"=>"50"      
      "test"=>"test-val"
    };
    
    <UserTag name="Supun" gender="male"  {...user} age="66" />
    

    then the tag will equal this:

    <UserTag name="Joe" gender="male" test="test-val" age="66" />
    

    So what happened was when you use Spread syntax in a react tag it takes tag's attribute as object attributes which merge(replace if it exists) with the given object user. also, you might have noticed one thing that it only replaces before attribute, not after attributes. so in this example age remains as it is.

    Hopes this helps :)

    0 讨论(0)
  • 2020-11-22 00:19

    This will be compiled into:

    React.createElement(Modal, { ...this.props, title: "Modal heading", animation: false }, child0, child1, child2, ...)
    

    where it gives more two properties title & animation beyond the props the host element has.

    ... is the ES6 operator called Spread.

    See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

    0 讨论(0)
  • 2020-11-22 00:21

    This is a feature of ES6, which is used in React as well. Look at the below example:

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

    This way is fine if we have a maximum of 3 parameters. But, what if we need to add for example 110 parameters. Should we define them all and add them one by one?

    Of course there is an easier way to do, which is called SPREAD. Instead of passing all those parameters you write :

    function (...numbers){} 
    

    We have no idea how many parameters we have, but we know there are heaps of those. Based on ES6, we can rewrite the above function as below and use the spread and mapping between them to make it as easy as a piece of cake:

    let Sum = (...numbers) => {
    return numbers.reduce((prev, current) => prev + current );
    }
    console.log(Sum(1, 2, 3, 4, 5, 6, 7, 8, 9));//45
    
    0 讨论(0)
  • 2020-11-22 00:22

    The three dots represent the Spread Operator in ES6. It allows us to do quite a few things in Javascript:

    1. Concatenate arrays

      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. Destructuring an array

        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. Combining two objects

      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'}
      

    There's another use for the three dots which is known as Rest Parameters and it makes it possible to take all of the arguments to a function in as one array.

    1. Function arguments as array

       function fun1(...params) { 
      
       }  
      
    0 讨论(0)
提交回复
热议问题