在Vue.js
中我们使用
元素作为承载分发内容的出口,作者称其为插槽,可以应用在组合组件的场景中;
比如准备制作一个待办事项组件(todo) , 该组件由待办标题(todo-title) 和待办内容(todo-items)组成(使用slot插槽嵌套组件):
//定义一个列表组件
Vue.component("todo",{
template:"<div>\
<slot name='todo-title'>slot>\
<ul>\
<slot name='todo-items' >slot>\
ul>\
div>"
})
//标题
Vue.component("todo-title",{
props:["title"],
template: "<div>{{title}}div>"
})
//列表
Vue.component("todo-items",{
props:["items"],
template:"<li>{{items}}li>"
})
初始化数据:
var vm = new Vue({
el:"#app",
data:{
title:["后端课程"],
todoItems:["java","mysql","linux"]
}
});
绑定数据和组件:
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title">todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :items="item">todo-items>
todo>
div>
Tips: v-bind可以简写成**:** ,v-on可以简化为**@**
完整代码:
DOCTYPE html>
<html lang="en" xmlns:v-if="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title">todo-title>
<todo-items slot="todo-items" v-for="item in todoItems" :items="item">todo-items>
todo>
div>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js">script>
<script>
//定义一个列表组件
Vue.component("todo",{
template:"\
\
\
\
\
"
})
//标题
Vue.component("todo-title",{
props:["title"],
template: "{{title}}"
})
//列表
Vue.component("todo-items",{
props:["items"],
template:"{{items}} "
})
var vm = new Vue({
el:"#app",
data:{
title:["后端课程"],
todoItems:["java","mysql","linux"]
}
});
script>
body>
html>
通以上代码不难发现,数据项在Vue的实例中, 但删除操作要在组件中完成, 那么组件如何才能删除Vue实例中的数据呢?此时就涉及到参数传递与事件分发了, Vue为我们提供了自定义事件的功能很好的帮助我们解决了这个问题; 使用this.$emit(‘自定义事件名’, 参数) , 操作过程如下:
var vm = new Vue({
el:"#app",
data:{
title:["后端课程"],
todoItems:["java","mysql","linux"]
},
methods:{
removeItems:function (index) {
this.todoItems.splice(index,1)
}
}
});
Vue.component("todo-items",{
props:["items","index"],
template:"{{index}}--{{items}}   ",
methods: {
remove:function (index) {
this.$emit("remove",index)
}
}
})
<todo-items slot="todo-items" v-for="(item,index) in todoItems" :items="item" :index="index" v-on:remove="removeItems(index)">todo-items>
DOCTYPE html>
<html lang="en" xmlns:v-if="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Titletitle>
head>
<body>
<div id="app">
<todo>
<todo-title slot="todo-title" :title="title">todo-title>
<todo-items slot="todo-items" v-for="(item,index) in todoItems" :items="item" :index="index" v-on:remove="removeItems(index)">todo-items>
todo>
div>
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.min.js">script>
<script>
//定义一个列表组件
Vue.component("todo",{
template:"\
\
\
\
\
"
})
//标题
Vue.component("todo-title",{
props:["title"],
template: "{{title}}"
})
//列表
Vue.component("todo-items",{
props:["items","index"],
template:"{{index}}--{{items}}   ",
methods: {
remove:function (index) {
this.$emit("remove",index)
}
}
})
var vm = new Vue({
el:"#app",
data:{
title:["后端课程"],
todoItems:["java","mysql","linux"]
},
methods:{
removeItems:function (index) {
this.todoItems.splice(index,1)
}
}
});
script>
body>
html>
核心:数据驱动,组件化
优点:借鉴了AngularJS的模块化开发和React的虚拟Dom,虚拟Dom就是把Demo操作放到内存中执行;
常用的属性:
v-if
v-else-if
v-else
v-for
v-on绑定事件,简写@
v-model数据双向绑定
v-bind给组件绑定参数,简写:
组件化:
组合组件slot插槽
组件内部绑定事件需要使用到this.$emit("事件名",参数);
计算属性的特色,缓存计算数据
遵循SoC关注度分离原则,Vue是纯粹的视图框架,并不包含,比如Ajax之类的通信功能,为了解决通信问题,我们需要使用Axios框架做异步通信;
说明
Vue的开发都是要基于NodeJS,实际开发采用Vue-cli脚手架开发,vue-router路由,vuex做状态管理;Vue UI,界面我们一般使用ElementUI(饿了么出品),或者ICE(阿里巴巴出品)来快速搭建前端项目~~
官网:
https://element.eleme.cn/#/zh-CN
https://ice.work/