首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
第 7 章 处理用户交互
7.1 事件的监听与处理
7.1.1 事件监听示例
7.1.2 多事件处理
7.1.3 事件修饰符
7.2 Vue中的事件类型
7.2.1 常用的事件类型
7.2.2 按键修饰符
7.3 实战一:随鼠标移动的小球
7.4 实战二:弹球游戏
第 8 章 组件基础
8.1 关于Vue应用与组件
8.1.1 Vue应用的数据配置选项
8.1.2 定义组件
8.2 组件中数据与事件的传递
8.2.1 为组件添加外部属性
8.2.2 处理组件事件
8.2.3 在组件上使用v-model指令
8.3 自定义组件的插槽
8.3.1 组件插槽的基本用法
8.3.2 多具名插槽的用法
8.4 动态组件的简单应用
8.5 实战:开发一款小巧的开关按钮组件
第 9 章 组件进阶
9.1 组件的生命周期与高级配置
9.1.1 生命周期方法
9.1.2 应用的全局配置选项
9.1.3 组件的注册方式
9.2 组件props属性的高级用法
9.2.1 对props属性进行验证
9.2.2 props的只读性质
9.2.3 组件数据注入
9.3 组件Mixin技术
9.3.1 使用Mixin来定义组件
9.3.2 Mixin选项的合并
9.3.3 进行全局Mixin
9.4 使用自定义指令
9.4.1 认识自定义指令
9.4.2 自定义指令的参数
9.5 组件的Teleport功能
第 10 章 Vue响应性编程
10.1 响应性编程原理与在Vue中的应用
10.1.1 手动追踪变量的变化
10.1.2 Vue中的响应性对象
10.1.3 独立的响应性值Ref的应用
10.2 响应式的计算与监听
10.2.1 关于计算变量
10.2.2 监听响应式变量
10.3 组合式API的应用
10.3.1 关于setup方法
10.3.2 在setup方法中定义生命周期行为
10.4 实战:支持搜索和筛选的用户列表示例
10.4.1 常规风格的示例工程开发
10.4.2 使用组合式API重构用户列表页面
当前位置:
首页>>
技术小册>>
TypeScript和Vue从入门到精通(三)
小册名称:TypeScript和Vue从入门到精通(三)
### 9.2.2 props的只读性质 在Vue.js框架中,`props` 是父组件向子组件传递数据的一种机制,它允许子组件接收来自父组件的数据,并在其内部使用这些数据来渲染视图或执行逻辑。然而,`props` 的一个核心原则是它们应该是只读的,这意味着在子组件中直接修改 `props` 的值是不被推荐且可能导致不可预测的行为的。这一原则确保了组件间的数据流向清晰且易于维护,同时也促进了组件的复用性和独立性。 #### 9.2.2.1 理解只读性质 首先,我们需要明确为什么 `props` 应该是只读的。在Vue的组件化设计中,每个组件都应该有明确的职责和边界。父组件负责向子组件提供必要的数据(通过 `props`),而子组件则负责根据这些数据来渲染界面或执行操作。如果允许子组件修改 `props`,那么这种数据流向就会变得模糊,因为父组件可能无法预知子组件何时以及如何修改了这些数据,这会导致组件间的耦合度增加,降低代码的可维护性和可预测性。 此外,Vue的响应式系统是基于依赖追踪的。当 `props` 被修改时,Vue需要能够追踪到这些变化并相应地更新DOM。然而,如果子组件直接修改了 `props`,Vue可能无法正确地追踪到这些变化,因为Vue默认 `props` 是由父组件控制的。这可能导致视图更新不及时或不一致,进而引发bug。 #### 9.2.2.2 遵守只读性质的最佳实践 为了遵守 `props` 的只读性质,我们可以采取以下最佳实践: 1. **避免直接修改 `props`**: 在子组件中,永远不要直接修改通过 `props` 接收到的数据。如果需要根据 `props` 的值来生成新的数据,应该使用计算属性(computed properties)或数据属性(data properties)来存储这些新数据。 2. **使用计算属性**: 当需要根据 `props` 的值来派生新的值时,计算属性是一个很好的选择。计算属性是基于它们的响应式依赖进行缓存的,只有当相关依赖发生改变时,计算属性才会重新求值。这既保证了性能,又避免了直接修改 `props`。 3. **使用事件通信**: 如果子组件需要基于 `props` 的值来执行某些操作,并且这些操作的结果需要反馈给父组件,那么应该通过事件(events)来实现通信。子组件可以触发一个事件,并将需要的数据作为事件的参数传递给父组件,父组件监听这个事件并相应地更新自己的状态或数据。 4. **明确 `props` 的验证和类型**: 在Vue中,可以通过组件的 `props` 选项来定义 `props` 的类型、默认值、验证函数等。这有助于在开发过程中及早发现错误,并确保 `props` 的使用符合预期。同时,明确的类型定义也有助于提高代码的可读性和可维护性。 5. **文档化 `props`**: 对于复杂的组件,文档化 `props` 是非常重要的。在组件的注释或文档中,清晰地说明每个 `props` 的用途、类型、默认值以及可能的值范围,有助于其他开发者(包括未来的你)更快地理解和使用这些组件。 #### 9.2.2.3 示例:遵守只读性质的组件设计 假设我们有一个名为 `TodoItem` 的子组件,它接收一个 `todo` 对象作为 `prop`,该对象包含 `id`、`text` 和 `completed` 三个属性。我们的目标是展示这个待办事项,并允许用户通过点击来切换其完成状态。但是,我们需要注意不能直接修改 `todo` 对象中的 `completed` 属性。 ```vue <!-- TodoItem.vue --> <template> <div> <input type="checkbox" :checked="isCompleted" @change="toggleCompletion"> <span>{{ todo.text }}</span> </div> </template> <script> export default { props: { todo: { type: Object, required: true, // 可以添加更复杂的验证逻辑 }, }, computed: { // 使用计算属性来获取 completed 的值,但不直接修改它 isCompleted() { return this.todo.completed; }, }, methods: { toggleCompletion() { // 触发一个事件,将需要更新的 todo 传递给父组件 this.$emit('update:todo', { ...this.todo, completed: !this.todo.completed, }); }, }, }; </script> ``` 在父组件中,我们可以监听这个 `update:todo` 事件,并相应地更新父组件中的待办事项列表: ```vue <!-- TodoList.vue --> <template> <div> <todo-item v-for="todo in todos" :key="todo.id" :todo="todo" @update:todo="handleTodoUpdate" /> </div> </template> <script> import TodoItem from './TodoItem.vue'; export default { components: { TodoItem, }, data() { return { todos: [ // 假设的待办事项列表 ], }; }, methods: { handleTodoUpdate(updatedTodo) { // 更新父组件中的 todos 列表 const index = this.todos.findIndex(todo => todo.id === updatedTodo.id); if (index !== -1) { this.$set(this.todos, index, updatedTodo); } }, }, }; </script> ``` 在这个例子中,`TodoItem` 组件通过触发 `update:todo` 事件来通知父组件更新待办事项的状态,而不是直接修改 `props`。这样,我们就遵守了 `props` 的只读性质,同时保持了组件间的清晰通信和独立性。
上一篇:
9.2.1 对props属性进行验证
下一篇:
9.2.3 组件数据注入
该分类下的相关小册推荐:
TypeScript和Vue从入门到精通(五)
Vue.js从入门到精通(三)
vuejs组件实例与底层原理精讲
TypeScript和Vue从入门到精通(一)
vue项目构建基础入门与实战
Vue原理与源码解析
TypeScript和Vue从入门到精通(二)
移动端开发指南
Vue.js从入门到精通(四)
Vue源码完全解析
Vue.js从入门到精通(二)
Vue.js从入门到精通(一)