VUE 之 组件
组件是为了解决页面布局的。
什么是单页面?
答:整个页面的切换都是在这个页面上进行变化的,没有页面的刷新。
1、全局组件
1.1全局组件流程: 1.创建全局组件======>创建一个Vue实例
<div id="app">
<global-component></global-component> # 第一种渲染<global-component>的方法。流程:1>全局组件中有一个global-component参数,此时就开始查。2>查到new Vue中的app有
</div> # global-component标签,此时就会将data中的数据传给template中进行替换。由于自定义的标签在<div id='app'>中包着,所以生成的页
<script> # 也有div包着
Vue.component("global-component",{
template:`<div><h1>{{name}}</h1></div>`,
data(){
return {
name:'我叫小沈阳'
}
} });
new Vue({
el:'#app',
// template:`<global-component></global-component>` # 第二种渲染方法 由于Vue根实例中有了template来承载自定义的标签,div顶部中就不需要写自定义标签了。而此时就会把Vue
}) # 实例中自定义的标签作为根,在这个标签中进行渲染数据。
2、局部组件
局部组件实际上就是创建了一个JavaScript object
局部组件的执行流程: 创建一个局部组件(let 变量)=====>然后创建一个Vue根实例。 =====>创建一个入口app来承载本来应该在Vue实例中的代码,为了是代码更加清晰。
内部的三大步骤:创建局部组件====>注册(components)=====>使用
<div id='app'>
</div>
let Header = {
template:`<div><h1>{{greeting}}</h1></div>`, # let Header 就是创建一个局部组件,内部除了没有el属性,其他属性都可以写。必须要有承载标签的template
data(){
return{
greeting:'HELLO World'
}
}
};
let App = { # 创建一个App入口,内部注册一个app_header标签指向Header,然后用template承载该标签。
template:`<div><app_header></app_header></div>`,
components:{
app_header:Header
}
};
new Vue({ # 创建一个Vue根实例 注册一个 属性名:指向App,在template中承载该标签。
el:"#app",
template:`<div><APP></APP></div>`,
components:{
APP:App
}
})
3、父子组件通信
父组件如何给子组件传送数据
<div id="app">
</div>
<script>
let Son = { 1、# 先定义自一个局部组件
template:`<div>
<h1>{{greeting}}</h1>
<h2>{{father}}</h2> 7、#将数据交给template进行渲染
</div>`,
props:['father'], 6、# 子组件中通过props:[],这种形式来接收父组件传送来的数据
data(){
return{
greeting:'Hello World'
}
}
};
let App = { 2、# 再定义一个入口组件注册局部组件
template:`<div>
<my_son v-bind:father="fatherData"></my_son> 5、# 给注册的属性绑定一个字定义属性,father
</div>`,
components:{
my_son:Son
},
data(){ 4、# 将数据赋值给自定义的属性father
return{
fatherData:'Who are you!'
}
}
};
new Vue({ 3、# 创建一个Vue实例,注册所有组件的入口组件
el:"#app",
template:`<App></App>`,
components:{
App
}
})
</script>
4、子父组件的通信
子组件如何将数据传送给父组件
业务要求:点击子组件让父组件的字体变大
<div id="app"></div>
<script>
let Son = { 1、# 创建一个子组件
template:`<div>
<button @click="Son_Click">点我就会变大</button>
</div>`,
methods:{ 9、# 只要绑定事件就用methods,然后通过this.$emit('自定义父组件中的事件',参数)
Son_Click:function () {
this.$emit('change_size',0.1)
}
}
};
let Father = { 2、# 创建一个入口父组件
template:`<div>
<span :style="{fontSize:postFontSize + 'em'}">我是你爸爸</span> 11、# 通过参数的传递使得字体发生变化,在template中渲染出来。
<my_son @change_size="fatherClick"></my_son> 5、# 生成自定义的标签,并绑定一个自定义的点击事件,这个change_size就是自定义的,相当于
</div>`, click,父组件绑定字定义点击事件是用来监听父组件是否发生变化
components:{ 4、# 注册子组件
my_son:Son
},
data(){ 6、# 传送数据,设定posFontSize 默认字体大小为1
return{
postFontSize:1
}
},
methods:{ 7、# 由于绑定了事件,所以要用methods方法,然后自定义一个fatherClick函数 赋值给自定义事件
fatherClick:function (value) { 10、# value 用来接收子组件传过来的参数。
this.postFontSize += value
}
} };
new Vue({ 3、# 创建一个Vue实例
el:'#app',
template:`<Father></Father>`,
components:{
Father
}
})
</script>
5、非子父之间通信(用中间调度器)
<script>
let hanfei = new Vue(); // 中间调度器什么都不传
let B = {
template: `<div>
<h1>这是B</h1>
<button @click="my_click">点我向A说话</button>
</div>`,
methods: {
my_click: function () {
console.log("马")
// 向A说话
// 向中间调度器提交事件
hanfei.$emit("maweihua_say", "晚上等我一起吃饭~~~") // 组件向中间调度器提交过来的数据用$emit
}
}
};
let A = {
template: `<div><h1>这是A</h1>{{say}}</div>`,
data(){
return {
say: ""
}
},
mounted(){
// 监听中间调度器中的方法
let that = this;
hanfei.$on("maweihua_say", function (data) { //中间调度器向组件提交数据的时候用$on
console.log(data)
that.say = data
})
}
}; const app = new Vue({
el: "#app",
components: {
A,
B
}
}) </script>
6、混入(mixs)
由于有多个组件存在且有使用相同的可能是数据,也可能是方法时,就可以用混入mixs来封装这个数据或者方法,然后在其他组件调用即可。
<div id="app"></div>
<script>
let mixs = { # 由于都使用了show方法,所以创建一个mixs组件用来封装这些属性
methods: {
show: function () {
console.log('我来了')
}
}
};
let A = { # 创建组件A
template: `<div>
<button @click="show">点我</button> # 使用了show这个方法
</div>`,
mixins: [mixs], # 通过固定搭配 mixins:[mixs]调用 mixs这个组件
};
let B = { # 创建组件B
template: `<div>
<button @mouseenter="show">触摸我</button> # 使用了show这个方法
</div>`,
mixins: [mixs],
}; new Vue({ # 创建Vue实例
el: "#app",
template: `<div>
<A></A>
<B></B>
</div>`,
components: {
A:A,
B:B
}
}) </script>
7、插槽
插槽可以进行内容的分发,提高组件的复用性。相同的组件写多个块,就可以用插槽,写一个组件,然后通过slot进行内容分发,来提高复用性。
<div id="app">
<global-component>我佛</global-component> # 同相同的<global-component>标签可以写多个块
<global-component>慈悲</global-component>
</div>
<script>
Vue.component("global-component",{
template:`<div><slot></slot></div>`, # 可以通过slot进行数据分发,将多个块中的内容,而不是标签分发给template进行渲染
});
new Vue({
el:'#app',
})
</script>
8、具名插槽
也是插槽的一种,它是将所有的slot标签包在了自己定义的里边
<div id="app">
<global-component>
<div slot="header">首页</div>
<div slot="first">第一页</div>
<div slot="second">第二页</div>
</global-component>
</div>
<script>
Vue.component("global-component",{
template:`<div>
<slot name="header"></slot> # name 是slot中的夫定的写法
<slot name="first"></slot>
<slot name="second"></slot>
</div>`,
});
new Vue({
el:'#app',
})
</script>
VUE 之 组件的更多相关文章
- vue.js组件化开发实践
前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...
- 如何理解vue.js组件的作用域是独立的
vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...
- Vue 子组件向父组件传参
直接上代码 <body> <div id="counter-event-example"> <p>{{ total }}</p> & ...
- VUE.JS组件化
VUE.JS组件化 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎 ...
- Vue动态组件
前面的话 让多个组件使用同一个挂载点,并动态切换,这就是动态组件.本文将详细介绍Vue动态组件 概述 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以实现动 ...
- vue中组件的四种方法总结
希望对大家有用 全局组件的第一种写法 html: <div id = "app"> <show></show></div> js: ...
- 如何抽象一个 Vue 公共组件
之前一直想写一篇关于抽象 Vue 组件的随笔,无奈一直没想到好的例子.恰巧最近为公司项目做了一个数字键盘的组件,于是就以这个为例聊聊如何抽象 Vue 的组件. 先上 Demo 与 源码.(demo最好 ...
- vue的组件和生命周期
Vue里组件的通信 通信:传参.控制.数据共享(A操控B做一个事件) 模式:父子组件间.非父子组件 父组件可以将一条数据传递给子组件,这条数据可以是动态的,父组件的数据更改的时候,子组件接收的也会变化 ...
- 为什么VUE注册组件命名时不能用大写的?
这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先"VUE注册组件命名时不能用大写"其实这句话是不对的,但我们很多人开始都觉得是对的, ...
- vue的组件化运用(数据在两个组件互传,小问题总结)
一.vue的组件化应用 首先,知道有哪些相关的属性需要用到,再慢慢去理解,运用. 1.两个vue页面 2. slot占位符(可用可不用) 3.props内置属性 4.watch监听函数 5.impor ...
随机推荐
- VOC Segmentation GT图像颜色表生成分析
本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/52185581 PASCAL VOC图像 ...
- iOS学习笔记22-推送通知
一.推送通知 推送通知就是向用户推送一条信息来通知用户某件事件,可以在应用退到后台后,或者关闭后,能够通过推送一条消息通知用户某件事情,比如版本更新等等. 推送通知的常用应用场景: 一些任务管理APP ...
- 【Luogu】P1131时态同步(树形DP)
题目链接 甚矣吾衰也!这么简单的DP我都不会了 太恐怖了 树形DP,从子树里选出时间最长的来,剩下的调到这个最长时间即可. #include<cstdio> #include<cct ...
- hibernate的cascade问题
cascade属性的可能值有 all: 所有情况下均进行关联操作,即save-update和delete. none: 所有情况下均不进行关联操作.这是默认值. save-update: 在执行sav ...
- hdu 4819 Mosaic 树套树 模板
The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). He ...
- POJ 2125 最小点权覆盖集(输出方案)
题意:给一个图(有自回路,重边),要去掉所有边,规则:对某个点,可以有2种操作:去掉进入该点 的所有边,也可以去掉出该点所有边,(第一种代价为w+,第二种代价为w-).求最小代价去除所有边. 己思:点 ...
- Python练习题–持续更新
1.你是一个高级测试工程师,现在要做性能测试,需要你写一个函数,批量生成一些注册使用的账号. 产生的账号是以@163.com结尾,长度由用户输入,产生多少条也由用户输入,用户名不能重复,用户名必须由大 ...
- (5)Swing事件
import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; publi ...
- STM32F10x_StdPeriph_Driver_3.5.0(中文版).chm的使用
以熟悉的固件库函数说明中函数GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_IintTypeDef *GPIO_InitStructure)为例 GPIOA...G ...
- 解决本地调用office组件成功,但是发布到IIS中出现的错误(检索COM类工厂中CLSID为{00024500-0000-0000-C000-000000000046}的组件时失败)
在C#操作word或者Excel,我们可能会用到微软内置的COM组件,会出现很多问题. 如:在本地调试导出Excel没有问题,发布到IIS就有问题了,检测到的异常: 我们会发现在iis上运行的程序,没 ...