Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >最佳实践:vue组件引用传值(续篇)

最佳实践:vue组件引用传值(续篇)

作者头像
奋飛
发布于 2022-09-08 04:19:24
发布于 2022-09-08 04:19:24
44000
代码可运行
举报
文章被收录于专栏:Super 前端Super 前端
运行总次数:0
代码可运行

本文是对 最佳实践:vue组件引用传值 的续篇:

上文中有提及,当父子组件对引用类型需要同步修改时,在子组件中需要切断相关引用,避免引用传值传递破坏 vue 单向数据流 的响应机制(如果直接修改 prop,vue 则会发出告警)。

但最近在项目代码中,看到了类似这样的写法(简化后):

index.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="app">
  <el-input v-model="data.a"></el-input>
  <child v-model="data"></child>
  {{data}}
</div>
<script>
var Main = {
  data() {
    return {
      data: {
        a: '123'
      }
    }
  }
}
var Ctor = Vue.extend(Main)
new Ctor().$mount('#app')
</script>

child.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<el-input v-model="form.a" placeholder="请输入内容"></el-input>
<script>
export default {
  name: 'child',
  prop: ['value'],
  computed: {
    form: {
      get () {
        return this.value
      },
      set (val) {
        this.$emit('input', val)
      }
    }
  }
}  
</script>

上述写法貌似很优雅,也实现了父子组件联动响应的诉求。但仔细思考,会发现,这正是 “引用传值” 的副作用,违背了 vue 单向数据流的设计初衷,之所以没有告警是因为“不是使用同一变量,重新声明了变量”。

验证是否为同一引用值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 在 child 中增加验证机制
watch: {
  'form': {
    handler (val) {
      console.log(this.form === this.value)	// true
    },
      deep: true
  }
}

所以,上述写法等价于

child.vue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<el-input v-model="form.a" placeholder="请输入内容"></el-input>
<script>
 export default {
  name: 'child',
  prop: ['value'],
  data () {
    return {
      form: this.value
    }
  }
}
</script>

这里,同样也实现了父子组件联动响应的诉求(借助 “引用传值” 的副作用)

综上,上述两种方式都不可取,需要大家深刻理解 vue 单向数据流思想,不要为了节省代码(或偷懒),产生难以维护的代码!!!

子组件 ① 切断引用;② 发生变化 $emit('input', form) 才是正解!!!

  • 切断一层:Object.assign()
  • 切断多层:JSON.parse(JSON.stringify())

延展思考:是否有场景传引用,就是为了使用一个对象呢?

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
vue组件引用传值的最佳实践
所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外变更父级组件的状态,从而导致你的应用的数据流向难以理解。
奋飛
2020/05/28
1.9K0
Vue2/3 自定义组件的 v-model 到底怎么写?💎
在使用第三方UI组件库时会发现可以在他们的组件上使用 v-model ,比如 Element-UI 或者 Element-plus 的 el-input 就可以使用 v-model 进行数据绑定。
德育处主任
2022/09/09
9100
Vue2/3 自定义组件的 v-model 到底怎么写?💎
Vue传值与状态管理总结
使用prop使得父子组件形成一个单向下行绑定:一般情况下,父级prop的更新会流动到子组件中,但是反过来则不行;
前端老道
2022/03/29
2.3K0
Vue JSX、自定义 v-model
最初用到 JSX,就是做这个博客的时候。iview 表格组件,不支持像 element 那样直接写 html 代码渲染,只能通过 render 函数渲染,也就是 JSX 语法
Krry
2020/07/16
4.8K1
7个 Vue3 中的组件通信方式
本文采用<script setup />的编写方式,比options API更自由。然后我们会讲以下七种组件通信方式:
唐志远
2022/10/27
7810
7个 Vue3 中的组件通信方式
浅入深出Vue:子组件与数据传递
上一篇了解了组件的概念及在使用中需要注意的地方。在面对单个组件逻辑复杂需要拆分时,难免会遇到父子组件之间数据传递的问题。那么我们来了解一下在父子组件之间进行数据传递时需要遵循哪些约定,以及要注意哪些问题。
熙世
2019/07/13
9970
Electron + Vue跨平台桌面应用开发实战教程(三)
我们从截图里可以看到,右侧区域主要是由标题栏和内容编辑区组成,其中标题栏的右侧还包含了一排操作按钮,在这里我们就先把这一排按钮忽略了,先把主要功能开发完毕再考虑迭代优化。
Javanx
2020/08/19
1.6K0
Electron + Vue跨平台桌面应用开发实战教程(三)
腾讯二面vue面试题总结
对象内部通过 defineReactive 方法,使用 Object.defineProperty 来劫持各个属性的 setter、getter(只会劫持已经存在的属性),数组则是通过重写数组7个方法来实现。当页面使用对应属性时,每个属性都拥有自己的 dep 属性,存放他所依赖的 watcher(依赖收集),当属性变化后会通知自己对应的 watcher 去更新(派发更新)
bb_xiaxia1998
2022/11/18
7960
Vue3 的 7 种和 Vue2 的 12 种组件通信,值得收藏
如果父组件是混合写法,子组件纯 Vue3 写法的话,是接收不到父组件里 data 的属性,只能接收到父组件里 setup 函数里传的属性。
Swift社区
2024/10/10
3580
Vue3 的 7 种和 Vue2 的 12 种组件通信,值得收藏
『前端工程』—— 封装第三方组件的三板斧
在封装第三方组件中,经常会遇到一个问题,如何通过封装的组件去使用第三方组件的 Attributes (属性)、 Events (自定义事件)、 Methods (方法)、 Slots (插槽)。
用户10106350
2022/10/28
8470
Vue.js 组件间的数据传递方法
这种应该是 vue.js 中最常见也是最为自然的一种方式了,要求我们在子组件中声明 props 然后在父组件中为子组件的 prop 赋值。
初代庄主
2022/03/30
6.3K0
Vue.js 组件间的数据传递方法
Vue3 过10种组件通讯方式
众所周知,Vue.js 中一个很重要的知识点是组件通信,不管是业务类的开发还是组件库开发,都有各自的通讯方法。
德育处主任
2022/04/17
2K0
Vue3 过10种组件通讯方式
分享几点关于 Vue 代码可读性的建议
近来入坑了一个Vue项目,感觉掉进了祖传屎山中,可读性极差,更别说可维护性了。故借此专栏提几点关于Vue代码可读性的建议,觉得有用的点个赞,觉得建议不合理的发表评论批评一下,有更好的建议欢迎发表评论补充一下。
前端达人
2021/11/26
1.2K0
vue-自定义组件传值
项目中,我们经常会遇到自定义组件传值的问题,方法很多种,但是原理很简单,下述文档总结实际项目中使用的传值方式。
庞小明
2018/08/01
6680
vue-自定义组件传值
Vue常用传值方式、父传子、子传父、非父子组件传值
在Vue的框架开发的项目过程中,经常会用到组件来管理不同的功能,有一些公共的组件会被提取出来。这时必然会产生一些疑问和需求?比如一个组件调用另一个组件作为自己的子组件,那么我们如何进行给子组件进行传值呢?如果是电商网站系统的开发,还会涉及到购物车的选项,这时候就会涉及到非父子组件传值的情况。当然你也可以用Vuex状态管理工具来实现,这部分我们后续会单独介绍。我先给大家介绍Vue开发中常用的三种传值方式。
IT工作者
2022/02/17
4.5K0
百度前端一面高频vue面试题汇总_2023-02-28
递归组件编译结果中,获取组件时会传递一个标识符 _resolveComponent("Comp", true)
用户10358241
2023/02/28
9780
组件化详细
最终效果: 必须是当前组件的元素, 才会有这个自定义属性, 才会被这个样式作用到
用户11097514
2024/05/31
3290
组件化详细
2023前端二面高频vue面试题集锦1
可以看到,组件内部只有一个动态节点,剩余一堆都是静态节点,所以这里很多 diff 和遍历其实都是不需要的,造成性能浪费
bb_xiaxia1998
2023/01/02
1.3K0
公司要求会使用框架vue,面试题会被问及哪些?
如果你是一个已经在学习前端开发的初学者亦或者是一名在代码界纵横多年的程序员,那你一定知道现在最火的前端框架之一Vue.js。它相比于React与Angular上手更加容易,或许这也是很多初学者选择vue的原因之一。
coder_koala
2019/07/30
2.6K0
公司要求会使用框架vue,面试题会被问及哪些?
Vue与React的异同-组件(二)
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/79113260
空空云
2018/09/27
1.4K0
相关推荐
vue组件引用传值的最佳实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验