JavaScript的展开运算符在React中的应用

今天在浏览React官网的示例时,发现一种写法:

javascript 复制代码
function Recipe({ id, name, ingredients }) {
  return (
    <div>
      <h2>{name}</h2>
      <ul>
        {ingredients.map(ingredient =>
          <li key={ingredient}>
            {ingredient}
          </li>
        )}
      </ul>
    </div>
  );
}

export default function RecipeList() {
  const recipes = [
    { id: 1, name: "Pasta", ingredients: ["Tomato", "Basil", "Garlic"] },
    { id: 2, name: "Pizza", ingredients: ["Cheese", "Tomato Sauce", "Dough"] }
  ];

  return (
    <div>
      <h1>菜谱</h1>
      {recipes.map(recipe =>
        <Recipe {...recipe} key={recipe.id} />
      )}
    </div>
  );
}

这里的

javascript 复制代码
<Recipe {...recipe} key={recipe.id} />

使用显示传递属性实际是这么定义的:

javascript 复制代码
<Recipe id={recipe.id} name={recipe.name} ingredients={recipe.ingredients} key={recipe.id} />

这种写法则是显式地定义每个属性,将 recipe 对象中的每个属性逐一传递给组件。这种方式在某些情况下可以提高代码的可读性,特别是当你只想传递部分属性时。

展开运算符,我平时编码过程中用的都是它的基本用法:

  1. 对象展开
javascript 复制代码
const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };

console.log(obj2); // 输出: { a: 1, b: 2, c: 3 }
  1. 数组展开
javascript 复制代码
const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];

console.log(arr2); // 输出: [1, 2, 3, 4, 5]
  1. 除此之外在React中还可以像开头那段代码这么使用,但要注意:
  • 避免属性冲突:如果展开的对象和组件的 props 中有相同的属性,后者会覆盖前者
  • 嵌套对象:展开语法只会展开一层属性,嵌套对象不会被展开
  1. 综合状态管理

如果你在使用状态管理(例如,React 的 useState),可以使用对象展开语法来更新对象的状态:

javascript 复制代码
const [state, setState] = useState({ a: 1, b: 2 });

const updateState = () => {
  setState(prevState => ({ ...prevState, b: 3 }));
};

总结

  • 选择使用哪种方式:如果你需要传递所有属性,使用对象展开语法会更简洁。而如果你只需要传递某些属性,显式传递属性可能会更清晰。
  • 注意事项 :当使用对象展开语法时,请确保 recipe 对象中没有不必要的属性,因为所有属性都会被传递给组件。
相关推荐
脑袋大大的4 小时前
JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘
开发语言·javascript·性能优化
速易达网络6 小时前
RuoYi、Vue CLI 和 uni-app 结合构建跨端全家桶方案
javascript·vue.js·低代码
耶啵奶膘6 小时前
uniapp+firstUI——上传视频组件fui-upload-video
前端·javascript·uni-app
JoJo_Way6 小时前
LeetCode三数之和-js题解
javascript·算法·leetcode
视频砖家6 小时前
移动端Html5播放器按钮变小的问题解决方法
前端·javascript·viewport功能
小白变怪兽8 小时前
一、react18+项目初始化(vite)
前端·react.js
GISer_Jing9 小时前
Monorepo+Pnpm+Turborepo
前端·javascript·ecmascript
天涯学馆9 小时前
前端开发也能用 WebAssembly?这些场景超实用!
前端·javascript·面试
我在北京coding10 小时前
TypeError: Cannot read properties of undefined (reading ‘queryComponents‘)
前端·javascript·vue.js