【Vue】Vue扫盲(一)事件标签、事件修饰符:@click.prevent @click.stop @click.stop.prevent、按键修饰符、及常用指令
【Vue】Vue扫盲(二)指令:v-for 、v-if、v-else-if、v-else、v-show
在大型应用开发的时候, 页面可以划分成很多部分。 往往不同的页面, 也会有相同的部分。 例如可能会有相同的头部导航。
但是如果每个页面都独自开发, 这无疑增加了我们开发的成本。 所以我们会把页面的不同部 分拆分成独立的组件,
然后在不同页面就可以共享这些组件, 避免重复开发。
1、组件的概念
在 vue 里, 所有的 vue 实例都是组件
2.1、组件的复用-全局组件
我们通过 Vue 的 component 方法来定义一个全局组件。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="app">
<button v-on:click="count++">我被点击了{{count}}次</button>
<!-- 使用抽取出来的公共组件,可以无限的被重复使用 -->
<counter></counter>
<counter></counter>
<counter></counter>
<counter></counter>
<counter></counter>
</div>
<script src="../node_modules/vue/dist/vue.js"></script>
<script>
/* 将点击增加数量的功能抽取成一个组件 */
//1、全局声明注册一个组件
Vue.component("counter",{
template:` <button v-on:click="count++">我被点击了{{count}}次</button>`,
data(){ //特别注意:这里需要是以函数的形式对于每个使用的地方都抽取成了一个新的对象,不能以之前的{} 来返回,这样的返回的话,如果对于一个页面,则会都使用了一个data了。会互相影响所有重复的组件
return {
count:1
}
}
});
new Vue({
el:"#app",
data:{
count:1
}
})
</script>
</body>
</html>
单个组件 :
其中这部分是对于组件的全局抽取、使用的代码:
使用代码&全局抽取代码
注意:对于抽取的data部分:这里需要是以函数的形式对于每个使用的地方都抽取成了一个新的对象,不能以之前的{} 来返回,这样的返回的话,如果对于一个页面,则会都使用了一个data了。会互相影响
//使用代码
<counter></counter>
<counter></counter>
<counter></counter>
<counter></counter>
<counter></counter>
、、抽取代码
<script>
/* 将点击增加数量的功能抽取成一个组件 */
//1、全局声明注册一个组件
Vue.component("counter",{
template:` <button v-on:click="count++">我被点击了{{count}}次</button>`,
data(){ //这里需要是以函数的形式对于每个使用的地方都抽取成了一个新的对象,不能以之前的{} 来返回,这样的返回的话,如果对于一个页面,则会都使用了一个data了。会互相影响所有重复的组件
return {
count:1
}
}
});
</script>
组件被多次重复使用之后的效果
组件其实也是一个 Vue 实例, 因此它在定义时也会接收: data、 methods、 生命周期函
数等
不同的是组件不会与页面的元素绑定, 否则就无法复用了, 因此没有 el 属性。
但是组件渲染需要 html 模板, 所以增加了 template 属性, 值就是 HTML 模板
全局组件定义完毕, 任何 vue 实例都可以直接在 HTML 中通过组件名称来使用组件了
data 必须是一个函数, 不再是一个对象。
因为导出的组件也是一个Vue实例,所以Vue中可以写的那些watch、computed都可以在导出的组件中写这些内容。
再次注意:组件的 data 属性必须是函数!一个组件的 data 选项必须是一个函数, 因此每个实例可以维护一份被返回对象的独立的拷
贝;因为这里需要是以函数的形式对于每个使用的地方都抽取成了一个新的对象,不能以之前的data{count:1} 来返回,因为之前这样的返回的话,如果对于一个页面,则会都使用了一个data了。会互相影响所有重复的组件的计数。
2.2、组件的复用-局部组件
一旦全局注册, 就意味着即便以后你不再使用这个组件, 它依然会随着 Vue 的加载而加载。
因此, 对于一些并不频繁使用的组件, 我们会采用局部注册;
示例
我们先在外部定义一个对象, 结构与创建全局组件时传递的第二个参数一致:
(一)我们先局部声明一个组件
<script>
//2、局部声明一个组件;这个需要在想要使用的Vue中的components中去声明;
const buttonCounter={
template:` <button v-on:click="count++">我被点击了{{count}}次~~~</button>`,
data(){ //这里需要是以函数的形式对于每个使用的地方都抽取成了一个新的对象,不能以之前的{} 来返回,这样的返回的话,如果对于一个页面,则会都使用了一个data了。会互相影响
return {
count:1
}
}
}
</script>
(二)然后再在下面的Vue实例中组件属性中去注册他
<script>
new Vue({
el:"#app",
data:{
count:1
},
components:{
'button-counter' :buttonCounter //注册上面局部组件后才能使用
}
})
</script>
(三)在Html的div中使用
使用效果: