您的位置:首页 > Web前端 > Vue.js

vue学习总结

2018-07-10 22:10 393 查看

事件的触发和监听(emit,on)

它们是父子组件的时候,可以直接在父组件上绑定事件,然后子组件触发的时候,就可以被监听到。


注意,这里是用v-on 绑定在引用的子组件标签上。然后,你在子组件$.emit(‘changDivText’)就可以触发 父组件里面定义的事件。

他们不是父子组件的时候,就要借用到一个新的实例,来触发和监听事件了。因为什么呢,因为你想想, 

  1. <child-one> 我有一个事件,名字叫我的哪个兄弟被点击了 </child-one>
  2. <child-two> 我要告诉大哥我被点击了 </child-two>
[/code]

这两个事件不是父子组件,当子组件二被点击时,根据事件传递。会像它的父级传递,并不会向子组件一传递,所以它监听不到这个事件啊,这里就需要借助到一个新的vue实例,做为中央事件总线。

var bus = new Vue()
[/code]
子组件一和子组件二导入bus实例。 
子组件二
bus.$emit('clicked',{name: '我是二弟'}) ;
[/code]子组件一  bus.$on(‘clicked’, ({name}) => { 
  1. console.log(name);
  2. });
[/code]毕竟,这个实例自己总能监听到自己的事件吧。==


说到事件,就来讲一讲最近写select 组件遇到的点击事件问题。 
已知多选是这样设置的:


checkbox 是这样的


所以写的时候就要借用到checkbox组件。


当我点击的时候,会触发两次,一次是label被点击了,触发了,input 被触发了。就触发了两次,那我一次选上,一次不选上,不是白点击了吗。。。。。

然后,想到监听select 改变,去选择,毕竟select 是因为input 的点击事件被改变的,在点击的时候只会改变一次。 但是,以为这样就解决了吗== 在选项初始化的时候,我要的判断这个选项有没有被选上,就面临着是否会改变select值,改变了就会再次触发选择事件,这个时候,在添加一个已经添加的值,就需要检查是否重复判断。

其实,这个还有一个方法,判断事件的event.target 是否是input, 是在添加值,初始化的时候也不会去添加值了。

组件的值的绑定 v-model指令

大家知道

<input v-model="value" >
 ,input的值和我们的在组件定义 data中的value 是绑定的,当我们input别的值的时候,data中的valu也改变了,这是为什么呢? 因为!!!!v-model相当于还监听了一个 ‘input’事件,不要告诉我你们都知道== ,它监听这个事件,并把输入的值赋值给你绑定的data-value。 所以知道了这个原理,我们就可以把它运用在组件上的绑定了。

父组件 

<div> 选择的结果是{{value}} 

  1. <sue-optionResult v-model=“value” > </sue-optionResult>
  2. </div>
子组件sue-optionResult 
  1. <template>
  2. <input :value="value" >
  3. </template>
  4. <script>
  5. export defualt {
  6. props: {
  7. value:{}
  8. }
  9. }
  10. </script>
[/code]那么,当输入值的时候,外部组件也能获取改变了。 但是,不输入值的时候呢?怎么办呢? 手动触发吧。把你想绑定的值传过去就好了。

slot内容分散器

<sue-vue> 我想显示 </sue-vue>
  “我想显示”这几个字根本不显示 == 这个时候就是用slot的时候了,在sue-vue组件里面,就得添加一行这样的代码: 
<slot></slot>
 => 这里的内容就是你在那四个字! 好,可以去官网看看了。 组件套用组件
  1. <sue-vue>
  2. <sue-child > </sue-child>
  3. </sue-vue>
!注意 
你知道怎么把子组件添加到sue-vue组件了,用slot 就可以, 思考一下,如果在slot 上绑定事件,sue-child 组件上hu有这个事件吗? 并没有,它并不会添加到你所替换的内容上去。 设置默认显示内容 父组件中: 
  1. <div>
  2. <sue-option> <span>选项一</span> </sue-option>
  3. </div>

子组件中写法,看好了!!! 
[javascript] view plain copy print?
  1. <code class=“language-javascript”><sue></sue>   
  2. <option></option>   
  3. <slot><span>选项二</span></slot> </code>  
  1. <sue></sue>
  2. <option></option>
  3. <slot><span>选项二</span></slot>
[/code]

你想想,页面会显示选项一还是选项二? 
没错,是选项一!,选项二在你没有写分散内容的时候,作为默认分散内容显示。

获取组件vue对象

获取子组件的vue对象 
在父组件挂载的时候,console.log(this.$children),可以查看子组件的vue 实例。当要获取子组件的数据的时候,可以使用。

同样的,获取父组件的vue对象 this.$parent,可以查看父元素的vue实例。

到这里,讲一个问题。在父组件使用 slot 分发内容容器,分发了一个组件,这个时候在slot 上用v-on 监听事件,分发的子组件是触发不了该事件的。 
如果这个时候通信怎么办呢? 
1:用bus中间事件。来看一个例子


sue-select 组件模板如下:


这里的slot 内容,可以知道是 
这是sue-option组件,它和父组件sue-select 通信,通过在slot上绑定监听没有用,所以这里,用bus来中间通信。在sue-option用

bus.$emit('click-up',
{value: this.value});
触发click-up事件, 在sue-select 外面用bus.$on监听。OK,很好。 
但是,如果你不止用了一个sue-select组件,而且里面有可能根本就没用这个子组件,但是它也能监听到啊,用了100个,100个都监听到了,执行了100次,如果用了1000次,10000次。。。。。没错,这样的代码就是我写出来的==

所以,这个时候,其实我们希望的还是父子互相的通信。先说一个思路,子组件的获取它的父组件实例,给父组件实例添加触发事件,然后,只有这个父实例才能监听到。

怎么获取到父元素的vue对象!!!!! this.$parent 怎么给父vue添加触发事件!!!!!
this.$parent.$emit()

这样,你就算写100个,那也只会触发它父元素的那一个啊,同理,父元素给子元素触发事件·········



阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: