视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
分享vue2.X组件的实例教程
2020-11-27 20:16:58 责编:小采
文档
 关注点:父子组件之间的通信

看图说话:

Pass Props

  • 子组件本身与父组件是孤立的,通过子组件中显示声明的props属性,接收父组件数据;

  • 父组件的数据更新时,子组件的prop会跟着更新;

  • 此数据流动是单向的(看着);

  • Emit Events

  • 子组件使用$.emit(fn)向外抛出自己的内部触发的事件;

  • 父组件是否监听?如果父组件需要监听,使用v-on绑定监听,触发对应事件;

  • 以上为通用语,具体分析

  • 子组件可以接收一个字符串,在子组件内部可以用{{label}}使用 

  • <v-input label="姓名"></v-input>
  • 子组件可以接收动态参数

  • <input v-model="msg" /><v-profile :message="msg"></v-profile>

    子组件接收到数据之后想处理一下不小心改了怎么办?

  • 给prop创建一个副本(建议深拷贝),处理副本,不动prop;

  • 父组件的数据改变后,子组件的prop会自动更新,但是这个prop的副本不会啊?

  • 使用watch监听这个prop,改变时更新副本;

  • 子组件的prop副本改变了想要通知父组件怎么办?

  • 使用watch监听这个副本,改变时向外抛出自己的内部触发的事件;

  • 。。

    其实以上???在2.3有了更好的方法,之前的就是看看。

    .sync修饰符

    ***父组件***
    <input v-model="msg" />
    <v-profile :message.sync="msg"></v-profile>
    ***子组件***$.emit('update:message',newValue)

    我是用了一下然后喜闻乐见的修改成功了,但是打开控制台有报错!!!

    vue.esm.js?65d7:434 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "message"

    子组件想要触发父组件可以emit(父组件需要监听才会触发),父组件触发子组件事件呢?

  • 通过在引用的子组件上使用ref属性实现父组件调用子组件的方法以及属性

  • 但是!$refs 只在组件渲染完成后才填充,并且它是非响应式的。它仅仅作为一个直接访问子组件的应急方案——应当避免在模版或计算属性中使用 $refs

    关注点:非父子组件之间的通信

    使用空的vue实例作为事件总线

    var bus = new Vue();// 触发组件 A 中的事件bus.$emit('id-selected', 1)// 在组件 B 创建的钩子中监听事件bus.$on('id-selected', function (id) { // ...})

    考虑vuex

    关注点:在组件中使用slot

    首先,在父组件中给子组件标签中间放置内容是无效的。然后slot出场。

    白话版本:

    匿名slot:
     slot标签存在与子组件template中;
     子组件在父组件中使用的时候,子组件标签中的结构会在编译后替换子组件的slot标签;
    如果子组件中没有slot,则父组件中子组件标签中的内容会消失; 具名slot: 顾名思义,是具有name属性的slot标签;并有匿名组件的特性(以上); 子组件在父组件中使用的时候,子组件中的结构中会有某些标签拥有slot属性并赋值,这些会在编译后替换子组件的相应slot标签;

    一句话解释:主要的内容是写在父组件中的子组件标签中,编译后插入子组件的相应位置

    讲真,说到这里我自己都不明白要slot干嘛。

    官方讲解入口

    官方给了个布局的例子:

    <div class="container">
     <header><slot name="header"></slot>
     </header>
     <main><slot></slot>
     </main>
     <footer><slot name="footer"></slot>
     </footer></div>
    View Code
    <app-layout>
     <h1 slot="header">这里可能是一个页面标题</h1>
     <p>主要内容的一个段落。</p>
     <p>另一个主要段落。</p>
     <p slot="footer">这里有一些联系信息</p>
    </app-layout>
    View Code

    关注点:动态组件使用

  • 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,我们让多个组件可以使用同一个挂载点,并动态切换:很适用于制作Tab类的效果

  • <component v-bind:is="currentView" :data1="data1" :data2="data2">
     <!-- 组件在 vm.currentview 变化时改变! -->
    </component>
  • 在methods属性中定义一个函数修改currentView即可。

  • 视情况可以配合 keep-alive 避免重新渲染

  • 在子组件上放置activate钩子做切换时的工作:done() //放到钩子最后,表示执行工作完毕,可以切换组件,配合keep-alive使用,activate钩子只执行一次

  • 子组件接收数据和以往相同,只是这一次都写在了component中,只是如此的话,每个子组件都需要有这些接口(prop)

  • 暂时说到这里,突然得回头看一下react,没时间了,回头会继续。

    以上的满基础的(我是新手),有什么不对的求指出,感谢!!!


    下载本文
    显示全文
    专题