美文网首页Vue
【Vue】自定义事件、动态插槽、异步组件

【Vue】自定义事件、动态插槽、异步组件

作者: Qingelin | 来源:发表于2019-10-14 00:15 被阅读0次

1. 自定义事件

1.1 事件名

  • 不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或属性名,所以就没有理由使用 camelCase 或 PascalCase 了。并且 v-on 事件监听器在 DOM 模板中会被自动转换为全小写 (因为 HTML 是大小写不敏感的),所以 v-on:myEvent 将会变成 v-on:myevent——导致 myEvent 不可能被监听到。
//js
this.$emit('myEvent')
//html
<!-- 没有效果 -->
<my-component v-on:my-event="doSomething"></my-component>

必须始终使用 kebab-case 的事件名

1.2 .sync修饰符

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

为了方便起见,我们为这种模式提供一个缩写,即 .sync 修饰符

//与上面的代码等价
<text-document v-bind:title.sync="doc.title"></text-document>

2. 插槽

  • A. 假设有一个组件 <navigation-link>,如果 <navigation-link> 的 template 里没有包含一个 <slot> 元素,则任何传入 <navigation-link> 的内容都会被抛弃。
    例如
//没有效果
<navigation-link>
    你好
  </navigation-link>
  • 使用具名插槽 <slot name="xxx'> 可以实现一个组件拥有多个插槽
  • 可以使用 <slot>默认内容</slot> 来指定插槽里的默认内容
  • 通过设置 slot 属性可以设置内容对应的插槽名字
  • 通过设置 slot-scope 属性,可以从子组件中获取数据

在vue.js 2.6.0 中,为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令)。它取代了 slotslot-scope 这两个目前已被废弃但未被移除且仍在文档中.


3. 动态组件

我们之前通常在一个多标签的界面中使用 is 特性来切换不同的组件:

 <component v-bind:is="currentTabComponent"></component>

当在这些组件之间切换的时候,你有时会想保持这些组件的状态,以避免反复重渲染导致的性能问题。

为了解决这个问题,我们可以用一个 <keep-alive> 元素将其动态组件包裹起来。

<!-- 失活的组件将会被缓存!-->
<keep-alive>
  <component v-bind:is="currentTabComponent"></component>
</keep-alive>

4. 异步组件

异步组件是指,在需要用到它的时候才从服务器加载一个组件

  • 如果项目支持 webpack 2+ 和 ES 2015+,那么可以这样实现异步组件

     Vue.component(
          'async-webpack-example',
          () => import('./my-async-component')
      )
    
  • 如果项目支持 webpack 2+ 和 ES 2015+,那么可以这样实现异步组件

    new Vue({
          // ...
          components: {
               'my-component': () => import('./my-async-component')
          }
      })
    

5. 处理边界情况

5.1 依赖注入

访问更深层的嵌套组件属性时,$parent属性无法满足,依赖注入提供了两个实例选项provide 和 inject。

//html
<div id="app">
    <component-one>
      <component-two>
        <component-three>

        </component-three>
      </component-two>
    </component-one>

  </div>
//js
Vue.component('component-one', {
  template: `
    <div><slot></slot></div>
  `,
  provide:{
    provide1(){
      console.log('这是component-one提供的函数')
    }
  }
})
Vue.component('component-two', {
  template: `
    <div><slot></slot></div>
  `,

})
Vue.component('component-three', {
  template: `
    <button @click="provide1">Click me</button>
  `,
  inject: ['provide1']
})

var app = new Vue({
  el: '#app',

})

5.2 事件侦听器

  • 可以通过 $on(eventName, eventHandler) 侦听一个事件
  • 可以通过 $once(eventName, eventHandler) 一次性侦听一个事件
  • 可以通过 $off(eventName, eventHandler) 停止侦听一个事件

相关文章

  • 【Vue】自定义事件、动态插槽、异步组件

    1. 自定义事件 1.1 事件名 不同于组件和 prop,事件名不会被用作一个 JavaScript 变量名或属性...

  • 简易实践的vue自定义tab入门

    本文基于vue官方文档,分别为:动态组件 & 异步组件、插槽、进入/离开 & 列表过渡 章节链接描述 要想实现ta...

  • Vue 学习记录二

    组件化: 动态组件 父子组件 插槽 数据共享(Vuex) Vue Router: 生命周期: Plugin 开发:...

  • vue其他知识点简单记录

    路由: 过渡动画 组件 数据绑定 事件 方法:事件可以调用方法 子父组件传值 插槽 动态组件

  • Vue的一些高级特性

    Vue的一些高级特性 兄弟组件之间的传值 自定义v-model $nextTick slot 动态,异步组件 ke...

  • vue.js 核心知识点六

    目录 - 6.1 父组件异步获取动态数据传递给子组件 - 6.2 vue-cli中自定义指令的使用 - 6.3 v...

  • vue 作用域插槽(插槽赋值)

    使用vue开发时,组件插槽slot是我们经常使用的特性之一,有时我们插槽中的自定义内容需要使用组件中的数据,这时就...

  • 组件通信、插槽、动态组件、异步组件

    修饰符 lazy number trim 组件化开发 思想:提供了一种抽象,让我们可以开发出一个个独立可复用的小组...

  • Vue: slot实现动态列表

    使用插槽前需要掌握Vue自定义组件的基础,插槽应用于自定义模板中,用于构建子模版,最形象的例子就是 列表标题(父模...

  • vue插槽slot

    -具名插槽 子组件Demo.vue 引用子组件的页面 -作用域插槽 子组件Demo.vue 引用子组件的页面

网友评论

    本文标题:【Vue】自定义事件、动态插槽、异步组件

    本文链接:https://www.haomeiwen.com/subject/pmzkmctx.html