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 ...
随机推荐
- Web开发细节搜集
App_Data 百度百科: App_Data文件夹应该包含应用程序的本地数据存储.它通常以文件(诸如Microsoft Access或Microsoft SQL Server Express数据库 ...
- hdu6073[dfs+删边] 2017多校4
题目中对二分图的定义十分特殊, 指的是 U,V两部分中,U的顶点度数必定为2,V中顶点无限制. 题目要求的是 对于所有匹配,该匹配的权值=该匹配中选中的边的边权的乘积,求所有匹配权值之和. 对于V中的 ...
- 跟着xiaoxin巨巨做cf
cf 385 C. Bear and Prime Numbers 题目大意:有一个数列{xi},每次给出一个询问[l, r],即问 S(l ,r)是l和r之间的素数,f(p)表示数列{xi}中整除p的 ...
- K-D tree入门
久仰K-D tree大名已久,终于在合适的时候遇见了合适的水题入了坑入了门 K-D tree是什么 K-D tree是什么? 按名字上翻译来就是K维的树,就是一个用来维护K维空间的点的平衡二叉树 K- ...
- 【2018.10.20】noip模拟赛Day3 二阶和
今年BJ省选某题的弱化版…… 这看起来就没那么难了,有几种方法维护,这里提两种. 第一种(傻逼的我写的) 维护 一维&二维前缀和. 对于一个长度为$m$的序列$b_1,b_2,...,b_m$ ...
- EGO V2
Original EGO: mkdir -p ~/Library/Developer/Xcode/UserData/FontAndColorThemes; cd ~/Library/Developer ...
- T1229 数字游戏 codevs
http://codevs.cn/problem/1229/ 题目描述 Description Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间. 这个游戏是这样的,首先,他拿出 ...
- 洛谷——P2298 Mzc和男家丁的游戏
P2298 Mzc和男家丁的游戏 题目背景 mzc与djn的第二弹. 题目描述 mzc家很有钱(开玩笑),他家有n个男家丁(做过上一弹的都知道).他把她们召集在了一起,他们决定玩捉迷藏.现在mzc要来 ...
- codevs 2669 简单的试炼
2.codevs 2669 简单的试炼 题目描述 Description 已知一个数S,求X和Y,使得2^X+3^Y=S. 输入描述 Input Description (多组数据) 每行一个整数 ...
- PythonCookbook读书笔记
第一章 数据结构和算法 1.1 将序列分解为单独的变量 适用于元组.列表.字符串等.只要是可迭代的对象,都可以执行分解操作.唯一的要求是变量的总数和结构要与序列相同. 1.2 从任意长度的可迭代对象中 ...