$event
1.在DOM事件的回调函数中传入参数$event,可以获取到该事件的事件对象
2.在子组件中通过$emit注册事件,将数据作为参数传入,在父组件中通过$event接收
props 传递数据
静态传值
<div id="app4">
<my-component4 message="数据来自父组件"></my-component4>
</div>
Vue.component('my-component4',{
props: ['message'],
template: '<div>{{message}}</div>'
});
var app4 = new Vue({
el: '#app4'
});
<div id= ” app4”>
<div >来自父组件的数据</ div>
</div>
动态传值
<div id="app5">
<input type="text" v-model="text">
<my-component5 :my-text="text"></my-component5>
</div>
Vue.component('my-component5',{
props: ['myText'],
template: '<div>{{myText}}</div>'
});
var app5 = new Vue({
el: '#app5',
data: {
text: '动态传递父组件数据'
}
});
:::info 注意:1.如果你要直接传递数字、布尔值、数组、对象,而且不使用v-bind ,传递的仅仅是字符串。 :::
绑定整个对象
todo: {
text: 'Learn Vue',
isComplete:false
}
<todo-item v-bind="todo"></todo-item>
//等价于
<todo-item
v-bind:is-complete="todo.isComplete"
v-bind:text="todo.text"></todo-item>
slot分发
简单来说,假如父组件需要在子组件内放一些DOM,那么这些DOM是显示、不显示、在哪个地方显示、如何显示,就是slot分发负责的活。
将放在子组件里的不同html标签放在不同的位置
父组件在要分发的标签里添加 slot=”name名” 属性
子组件在对应分发的位置的slot标签里,添加name=”name名” 属性,
然后就会将对应的标签放在对应的位置了。
<div id="app">
<children>
<span slot="first">12345</span>
<span slot="second">56789</span>
<!--上面这行不会显示-->
</children>
</div>
<script>
var vm = new Vue({
el: '#app',
components: {
children: { //这个无返回值,不会继续派发
template: "<button><slot name='first'></slot>为了明确作用范围,<slot name='second'></slot>所以使用button标签</button>"
}
}
});
</script>
<button>
<span slot="first">12345</span>
为了明确作用范围,
<span slot="second">56789</span>
所以使用button标签
</button>
⑤分发内容的作用域:
被分发的内容的作用域,根据其所在模板决定,例如,以上标签,其在父组件的模板中(虽然其被子组件的children标签所包括,但由于他不在子组件的template属性中,因此不属于子组件),则受父组件所控制。
当点击文字12345的区域时(而不是按钮全部),会触发父组件的tobeknow方法。
但是点击其他区域时则没有影响。
父组件模板的内容在父组件作用域内编译;子组件模板的内容在子组件作用域内编译
该slot标签内有内容,那么在无分发内容的时候,会显示该slot标签内的内容。
event自定义函数
- 使用 Event 构造函数
- 使用 CustomEvent 构造函数
- 使用 document.createEvent 来创建自定义事件,但从函数返回的对象所公开的大多数方法已被弃用,这里就不进行介绍
使用event构造函数
//事件不区分大小写,因此 myevent、myEvent 和 MyEvent 都相同。
//构造函数还接受一个对象,该对象指定与事件有关的一些重要属性
const myEvent = new Event('myevent', {
//是否冒泡,通过 event.stopPropagation() 停止事件的传播
bubbles: true,
//是否可以取消,原生 DOM 事件在默认情况下是可取消的,
//因此您可以对它们调用 event.preventDefault(),这将阻止事件的默认操作。
cancelable: true,
//omposed 属性指定事件是否应从 shadow DOM(使用 Web 组件时创建)冒泡到真实 DOM。
composed: false
})
CustomEvent 构造函数
当使用 Event 构造函数创建事件时,我们受到一个限制, 即我们无法通过事件将数据传递给监听器。在这里,任何需要传递给监听器的数据都可以在 detail 属性中传递,该属性是在初始化事件时创建的。
监听事件 ```javascript const ele = document.querySelector(‘#someElement’)const myEvent = new CustomEvent('myevent', {
//用于传递参数
detail: {},
bubbles: true,
cancelable: true,
composed: false
})
ele.addEventListener(‘myevent’, event => { console.log(‘我正在监听一个自定义事件’) })
派发事件
```javascript
ele.dispatchEvent(MyEvent)
运行后,将正常输出:我正在监听一个自定义事件。