前端培训-中级阶段(36)- vue2.x 组件定义和使用,组件间的通信

简介: 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。

Vue 组件



组件开发在 Vue 使用中很常见,好处有很多 解耦、并行开发、复用 等等。


使用上也很简单,我们可以对比一下 elementUI 的 el-input 和 原生的 input。


<el-input v-model="val">
<input v-model="val">


注册组件


组件可以理解为可复用的 Vue 实例,所以与 new Vue 接收相同的选项,例如 datacomputedwatchmethods 以及生命周期钩子等。


全局注册组件


通过 Vue.component 进行全局注册,注册之后可以用任何地方,包括组件树中的所有子组件的模板中。


// 定义一个名为 v-input 的全局组件
Vue.component('v-input', {
  data: function () {
    // data 必须是一个函数
    // 这样才能在多个位置使用时,多个组件不存在引用关系
    return {
      val: ''
    }
  },
  // template 必须有一个根节点。
  // 每个组件必须只有一个根元素(every component must have a single root element )
  template: `
      <div>
        <input v-model="val">
        val: {{val}}.
      </div>
  `
})


局部注册组件


局部注册就是在 components 里面写,只能用在当前组件模板中。


new Vue({
    el: '#app',
    components: {
        'v-input': {
          data: function () {
            // data 必须是一个函数
            // 这样才能在多个位置使用时,多个组件不存在引用关系
            return {
              val: ''
            }
          },
          // template 必须有一个根节点。
          template: `
              <div>
                <input v-model="val">
                val: {{val}}.
              </div>
          `
        }
})


组件通信


父子组件


父组件向子组件传值 props


父组件:


<v-avatar avatar="https://www.lilnong.top/favicon.ico"></v-avatar>


子组件:


Vue.component('v-avatar', {
  props: ['avatar'],
  template: '<img :src="avatar">'
})


子组件向父组件传值 $emit


测试地址:https://www.lilnong.top/static/html/sf-a-1190000022616927-vue-emit.html


父组件:


<v-input :value="val" @input="val = $event"></v-input>


子组件:


Vue.component('v-input', {
    props: ['val'],
    template: '<input :value="val" @input="emitInput">',
    methods:{
        emitInput(e){
            this.$emit('input', e.target.value)
        }
    }
})


使用 v-model


一般在我们使用中 v-model 的方式更常用


<input v-model="val">
<el-input v-model="val"></el-input>


那么 v-model 是如何实现父子组件通信的呢?


原生 DOM


<input v-model="val">

等价于

<input v-bind:value="val" v-on:input="val = $event.target.value" >


自定义组件


<v-input v-model="val"></v-input>

等价于

<v-input :value="val" @input="val = $event"></v-input>


从上面我们可以看到, v-model 类似于语法糖,本质上是通过绑定 value 和 input。


使用 .sync 修饰符


<text-document v-bind:title.sync="doc.title"></text-document>

等价于

<text-document v-bind:title="doc.title" v-on:update:title="doc.title = $event" ></text-document>


子组件中更新时: this.$emit('update:title', newTitle)


在有些情况下,我们需要对一个 prop 进行“双向绑定”。不幸的是,真正的双向绑定会带来维护上的问题,因为子组件可以变更父组件,且在父组件和子组件都没有明显的变更来源。

推荐以 this.$emit('update:myPropName') 的模式触发事件取而代之。

跨层级


  1. vuex


  1. eventBus
相关文章
|
3月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
333 2
|
6月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
821 0
|
7月前
|
JavaScript 前端开发 Java
制造业ERP源码,工厂ERP管理系统,前端框架:Vue,后端框架:SpringBoot
这是一套基于SpringBoot+Vue技术栈开发的ERP企业管理系统,采用Java语言与vscode工具。系统涵盖采购/销售、出入库、生产、品质管理等功能,整合客户与供应商数据,支持在线协同和业务全流程管控。同时提供主数据管理、权限控制、工作流审批、报表自定义及打印、在线报表开发和自定义表单功能,助力企业实现高效自动化管理,并通过UniAPP实现移动端支持,满足多场景应用需求。
680 1
|
8月前
|
JavaScript
vue实现任务周期cron表达式选择组件
vue实现任务周期cron表达式选择组件
1057 4
|
6月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
9月前
|
前端开发 API 开发者
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
本文由黑臂麒麟(6年前端经验)撰写,介绍ArkTS开发中的常用基础组件与布局组件。基础组件包括Text、Image、Button等,支持样式设置如字体颜色、大小和加粗等,并可通过Resource资源引用统一管理样式。布局组件涵盖Column、Row、List、Grid和Tabs等,支持灵活的主轴与交叉轴对齐方式、分割线设置及滚动事件监听。同时,Tabs组件可实现自定义样式与页签切换功能。内容结合代码示例,适合初学者快速上手ArkTS开发。参考华为开发者联盟官网基础课程。
771 75
harmonyOS基础- 快速弄懂HarmonyOS ArkTs基础组件、布局容器(前端视角篇)
|
8月前
|
移动开发 前端开发 JavaScript
Vue与React两大前端框架的主要差异点
以上就是Vue和React的主要差异点,希望对你有所帮助。在选择使用哪一个框架时,需要根据项目的具体需求和团队的技术栈来决定。
497 83
|
10月前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
670 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
7月前
|
JavaScript 前端开发 编译器
Vue与TypeScript:如何实现更强大的前端开发
Vue.js 以其简洁的语法和灵活的架构在前端开发中广受欢迎,而 TypeScript 作为一种静态类型语言,为 JavaScript 提供了强大的类型系统和编译时检查。将 Vue.js 与 TypeScript 结合使用,不仅可以提升代码的可维护性和可扩展性,还能减少运行时错误,提高开发效率。本文将介绍如何在 Vue.js 项目中使用 TypeScript,并通过一些代码示例展示其强大功能。
309 22
|
6月前
|
JavaScript 前端开发 UED
Vue 表情包输入组件的实现代码:支持自定义表情库、快捷键发送和输入框联动的聊天表情解决方案
本文详细介绍了在 Vue 项目中实现一个功能完善、交互友好的表情包输入组件的方法,并提供了具体的应用实例。组件设计包含表情分类展示、响应式布局、与输入框的交互及样式定制等功能。通过核心技术实现,如将表情插入输入框光标位置和点击外部关闭选择器,确保用户体验流畅。同时探讨了性能优化策略,如懒加载和虚拟滚动,以及扩展性方案,如自定义主题和国际化支持。最终,展示了如何在聊天界面中集成该组件,为用户提供丰富的表情输入体验。
528 8