当前位置: 首页 > article >正文

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

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

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>
  );
}

 这里的 

<Recipe {...recipe} key={recipe.id} />

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

<Recipe id={recipe.id} name={recipe.name} ingredients={recipe.ingredients} key={recipe.id} />

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

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

1. 对象展开

const obj1 = { a: 1, b: 2 };
const obj2 = { ...obj1, c: 3 };

console.log(obj2); // 输出: { a: 1, b: 2, c: 3 }

2. 数组展开

const arr1 = [1, 2, 3];
const arr2 = [...arr1, 4, 5];

console.log(arr2); // 输出: [1, 2, 3, 4, 5]

3. 除此之外在React中还可以像开头那段代码这么使用,但要注意:

  • 避免属性冲突:如果展开的对象和组件的 props 中有相同的属性,后者会覆盖前者
  • 嵌套对象:展开语法只会展开一层属性,嵌套对象不会被展开

4. 综合状态管理

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

const [state, setState] = useState({ a: 1, b: 2 });

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

总结

  • 选择使用哪种方式:如果你需要传递所有属性,使用对象展开语法会更简洁。而如果你只需要传递某些属性,显式传递属性可能会更清晰。
  • 注意事项:当使用对象展开语法时,请确保 recipe 对象中没有不必要的属性,因为所有属性都会被传递给组件。

http://www.kler.cn/a/394573.html

相关文章:

  • STM32 51单片机设计半导体制冷片温控设计
  • 第 13 章 -Go 语言 接口
  • react + ts定义接口类型写法
  • 【月之暗面kimi-注册/登录安全分析报告】
  • MySQL —— MySQL逻辑架构与查询过程
  • 从华为到创业公司
  • 游戏引擎学习第11天
  • 软件测试计划和测试用例详解
  • 鸿蒙学习生态应用开发能力全景图-鸿蒙生态伙伴 SDK 市场(4)
  • 家政服务平台管理系统(源码+文档+部署+讲解)
  • Sql进阶:字段中包含CSV,如何通过Sql解析CSV成多行多列?
  • 【数据结构】顺序表解析及实战运用
  • 【Redis实战篇】利用布隆过滤器解决缓存穿透问题
  • 力扣题目解析--合并两个链表
  • SystemVerilog学习笔记(十一):接口
  • 相机光学(四十)——2x2 Adjacent Pixel Binning
  • 小程序开发者工具的network选项卡中有某域名的接口请求,但是在charles中抓不到该接口
  • Python图像识别详解
  • STL学习-排序算法
  • Python-requests模块详解!
  • 威联通Docker Compose搭建NAS媒体库资源工具NAS Tools
  • C++单例模式实现
  • CSS盒子的定位> (中篇)#绝对定位#附练习
  • JAVA开源项目 微服务在线教育系统 计算机毕业设计
  • 【Linux上部署Dify】从本地到云端:在Linux上部署Dify并实现公网访问的流程
  • Go语言进阶之Context控制并发