自定义事件内容分发主要解决的问题是:Vue 实例的数据,但是 组件的方法事件需要操作实例的数据。然而作用域根本达到不了。
其实这个问题在这个方法之前,能够想到的解决方案有很多。比如说 我们可以 把要修改的数据提高作用域拿出来。再比如 我们 可以 将 那个带修改的数据 传参到组件的函数里。但是 无法 改变 原数据!无法做到 动态更新。所以我们 才需要 Vue 官方给出的方法。
this.$emit(自定义事件名,参数):去触发 一个自定义事件。并且提供 给 方法参数。
v-on:自定义事件名字 = "函数":自定义一个事件,并且绑定一个 方法函数。
首先 我们 先 绑定一个事件 给 组件。 Vue.component("mqy-item",{
props: ['value','index'],
template: '- {{value}}
',
methods: {
remove: function (index){
alert(index);
}
}
});
你会发现 我们 根本 摸不到 Vue 实例下面的 那个 arr 数组
v-on:自定义事件的名字 然后 绑定 Vue 实例下的 一个 methods 的 方法。 <mqy-item v-for="(item,index) in arr" slot="mqy-item" v-bind:value="item" :index="index"
v-on:vue-remove="arrRemove"
>mqy-item>
let vm = new Vue({
el: "#vue",
data: {
title: "标题",
arr: ["Java","前端","linux"]
},
methods: {
arrRemove: function (index){
console.log(index);
}
}
})
但是 我们 并不知道 这个 事件 什么时候触发!没有触发的机制。
诶,就恰好 是这个 点给到了 我们 机会!如果 我们让它 在 点击 组件的 按钮事件 的 函数那里 触发 该自定义事件的话。是不是 就相当于 跨过了 作用域的限制,摸到了 arr 数组呢??
this.$emit() 去 触发 这个 自定义 事件this.$emit("vue-remove",index);
Vue.component("mqy-item",{
props: ['value','index'],
template: '- {{value}}
',
methods: {
remove: function (index){
this.$emit("vue-remove",index);
}
}
});

DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>插槽 slot 的应用title>
head>
<body>
<div id="vue">
<mqy>
<mqy-title slot="mqy-title" v-bind:value="title">Fuck!mqy-title>
<mqy-item v-for="(item,index) in arr" slot="mqy-item" v-bind:value="item" :index="index"
v-on:vue-remove="arrRemove"
>mqy-item>
mqy>
div>
<script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.13/vue.js">script>
<script>
let Arr = [];
Vue.component("mqy",{
template: '\ \
'
});
Vue.component("mqy-title",{
props: ['value'],
template: '{{this.$slots.default[0].text}}'
});
Vue.component("mqy-item",{
props: ['value','index'],
template: '- {{value}}
',
methods: {
remove: function (index){
this.$emit("vue-remove",index);
}
}
});
let vm = new Vue({
el: "#vue",
data: {
title: "标题",
arr: ["Java","前端","linux"]
},
methods: {
arrRemove: function (index){
this.arr.splice(index,1); // 删除 index 下标的那个 元素
}
}
})
script>
body>
html>

有时候 会 使用 v-bind:key = "唯一标识" 这样可以 让 这些子项目 保持唯一性。比如说 三个子项 都有选择框,第一个第三个被选中。然后打乱排序后,可能 还是 第一个 和 第三个 被选中!但是 如果 你写了 v-bind:key = "唯一标识" ,就 还是以前的 第一个 和 第三个 被选中。即 动态保持了 唯一性。
Vue 的核心:数据驱动、组件化。
优点:借鉴了 AngulaJS 的模板化开发 和 React 的虚拟 Dom,虚拟Dom 就是把 Dom 的操作 放到内存中 高效执行。
常用的属性:
v-ifv-else-ifv-elsev-forv-on:绑定的事件名 = "绑定的函数" <–> 简写:@绑定的事件名 = "绑定的函数"v-model:属性名 = "绑定的表达式变量/数据" 应用于表单,可以实现数据双向绑定v-bind:参数名 = "绑定的表达式变量/数据" <–> 简写::参数名 = "绑定的表达式变量/数据" 单向绑定组件化
this.$emit("事件名",参数)遵循 SoC 关注度分离原则,Vue 是纯粹的视图框架,并不包含 “比如 Ajax 之类的 通信功能,为了解决通信问题,我们需要使用 Axios 框架 做 异步通信。”
实际开发的展望
Vue 的开发:
后端的话!大多数 都是基于 NodeJS的,当然 也有 基于 其它服务端程序的。Java 写的服务端接口也可以。运行在 tomcat 上。
前端的话!实际开发 大多数 都是 采用 vue-cli 脚手架开发 vue-router 路由 vuex 状态管理 ElementUI 饿了么Vue UI 或者 ICE 阿里巴巴出品 这一些列 来 **快速的 搭建前端的项目!! **