组件是为了解决页面布局的。

什么是单页面?

  答:整个页面的切换都是在这个页面上进行变化的,没有页面的刷新。

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 之 组件的更多相关文章

  1. vue.js组件化开发实践

    前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎么实现,技术选型自然 ...

  2. 如何理解vue.js组件的作用域是独立的

    vue.js组件的作用域是独立,可以从以下三个方面理解: 1.父组件模板在父组件作用域内编译,父组件模板的数据用父组件内data数据:2.子组件模板在子组件作用域内编译,子组件模板的数据用子组件内da ...

  3. Vue 子组件向父组件传参

    直接上代码 <body> <div id="counter-event-example"> <p>{{ total }}</p> & ...

  4. VUE.JS组件化

    VUE.JS组件化 前言 公司目前制作一个H5活动,特别是有一定统一结构的活动,都要码一个重复的轮子.后来接到一个基于模板的活动设计系统的需求,便有了下面的内容.借油开车. 组件化 需求一到,接就是怎 ...

  5. Vue动态组件

    前面的话 让多个组件使用同一个挂载点,并动态切换,这就是动态组件.本文将详细介绍Vue动态组件 概述 通过使用保留的 <component> 元素,动态地绑定到它的 is 特性,可以实现动 ...

  6. vue中组件的四种方法总结

    希望对大家有用 全局组件的第一种写法 html: <div id = "app"> <show></show></div> js: ...

  7. 如何抽象一个 Vue 公共组件

    之前一直想写一篇关于抽象 Vue 组件的随笔,无奈一直没想到好的例子.恰巧最近为公司项目做了一个数字键盘的组件,于是就以这个为例聊聊如何抽象 Vue 的组件. 先上 Demo 与 源码.(demo最好 ...

  8. vue的组件和生命周期

    Vue里组件的通信 通信:传参.控制.数据共享(A操控B做一个事件) 模式:父子组件间.非父子组件 父组件可以将一条数据传递给子组件,这条数据可以是动态的,父组件的数据更改的时候,子组件接收的也会变化 ...

  9. 为什么VUE注册组件命名时不能用大写的?

    这段时间一直在弄vue,当然也遇到很多问题,这里就来跟大家分享一些注册自定义模板组件的心得 首先"VUE注册组件命名时不能用大写"其实这句话是不对的,但我们很多人开始都觉得是对的, ...

  10. vue的组件化运用(数据在两个组件互传,小问题总结)

    一.vue的组件化应用 首先,知道有哪些相关的属性需要用到,再慢慢去理解,运用. 1.两个vue页面 2. slot占位符(可用可不用) 3.props内置属性 4.watch监听函数 5.impor ...

随机推荐

  1. jQuery中文文档

    http://www.jquery123.com/ http://www.shifone.cc/

  2. DDLog-不同颜色打印信息

    (一)下载安装 1.安装插件 XcodeColors Github 链接:https://github.com/robbiehanson/XcodeColors 打开XcodeColors项目,编译即 ...

  3. 【Luogu】P3387缩点(Tarjan缩点+深搜DP)

    题没什么好说的,因为是模板题.求值我用的是dfs. 不能直接在原图上dfs,因为原图上有环的话会发生一些滑稽的事情.所以我们要用Tarjan缩点.因为此题点权全为正,所以如果在图上走一个环当然可以全走 ...

  4. HDU——2612Find a way(多起点多终点BFS)

    Find a way Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. P2949 [USACO09OPEN]工作调度Work Scheduling

    题目描述 约翰有太多的工作要做.为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间. 他的工作日从0时刻开始,有10^8个单位时间.在任一时刻,他都可以选择编号1~N的N(1 <= ...

  6. Linux(7):用户管理

    用户管理 让一个脚本或命令开机自启动的方法: # 方法一: 把脚本放到 /etc/rc.local 中 # 方法二: 把脚本或命令通过 chkconfig 管理 # 如何让一个脚本被 chkconfi ...

  7. uva 10710 快速幂取模

    //题目大意:输入一个n值问洗牌n-1次后是不是会变成初始状态(Jimmy-number),从案例可看出牌1的位置变化为2^i%n,所以最终判断2^(n-1)=1(mod n)是否成立#include ...

  8. Dynamic Rankings(zoj 2112)

    题意:带修改的第K大 #include<cstdio> #include<iostream> #include<cstring> #define N 400010 ...

  9. python生成器及迭代器

    一.迭代器 迭代器是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 迭代器有两个基本的方法: ...

  10. R语言入门视频笔记--5--自定义函数

    自定义函数 你可以输出一段代码,创建一个你自己定义的函数 蛋是如果你两个自定义函数的名字重复的话,后面的会把前面的替换掉 举个栗子: hanshu1 <- function(x)  sqrt(v ...