vue中的组件,Component元素,自定义路由,异步数据获取
组件是Vue最强大的功能之一。
组件是一组可被复用的具有一定功能,独立的完整的代码片段,这个代码片段可以渲染一个完整视图结构
组件开发
如何注册组件?
第一步,在页面HTML标签中使用这个组件名称,像使用DOM元素一样。(通常是一个自定义元素)。
<div id="app">
<my-component></my-component>
</div>
第二步,使用Vue.extend方法创建一个组件
var MyComponent = Vue.extend({
// .........
})
在extend方法中接收一个对象.
这个对象是一个描述组件的对象,它具有Vue实例化对象上的属性方法,它还有一些特殊的属性
template:组件内部渲染模的板字符串
props:父组件向组件内部传入数据的引用
<div id="app">
<input type="text" v-model="inputVal"/>
<my-component msg="you" v-bind:inputtext="inputVal"></my-component>
</div>
想在template里用这个msg和inputVal
组件内部还没有这个msg和inputVal
v-bind是为了创造个js环境
所以将组件中的属性值引入组件内部通过props属性
var MyComponent = Vue.extend({
props:['msg','inputtext'],
//定义模板字符串
template: '<div>hello world!{{msg}}</div>'
})
第三步,使用Vue.component方法注册组件。
Vue.component('my-component', MyComponent)
eg:
//页面中使用组件
<div id="app">
<my-component></my-component>
</div>
// 定义组件
var MyComponent = Vue.extend({
//定义模板字符串
template: '<div>hello world!</div>'
})
// 注册组件
Vue.component('my-component', MyComponent)
//创建vue的实例化对象
new Vue({
el: '#app'
})
结果:
<div id="example">
<div>hello world!</div>
</div
在vue的组件中他是一个独立个体,因此他的事件,数据等等要绑定在组件的内部不是vue的实例化对象
注意:
子组件向父组件通信,通过子组件实例化对象上的$dispatch方法实现
第一个参数表示消息的名称
从第二个参数开始表示子组件向父组件传递的数据
eg:
var MyComponent = Vue.extend({
template: '<div>hello world!</div><button v-on:click="toUpper"></button>',
methods:{
toUpper:function(){
//具体的逻辑
//作用域 this指的是组件的实例化对象
this.$dispatch("abc",123)
}
}
})
为了接收子组件向父组件传送的消息。在父组件中订阅该消息 在events属性中定义这些消息
属性表示消息的名称
属性值是一个函数,表示处理消息的回调函数,参数是子组件发送消息时候传递参数,作用域 vue的实例化对象
new Vue({
el: '#app',
event:{
//接收子组件传递的数据 123
'abc':function(){
//作用域 vue的实例化对象
//参数就是[123]
}
}
})
Component元素
一旦向页面中渲染的时候,就会被删除,有一个属性叫做is属性,通过这个属性可以确定显示哪个组件,is是一个自定义属性,值是一个字符串,想让他的值是一个变量,要添加v-bind创建js环境。
<div id="app">
<component v-bind:is="view"></component>
</div>
var app = new Vue({
el: '#app',
data: {
view: 'home'//显示home这个组件
}
})
自定义路由
Vue没有为我们提供路由,自己定义路由
路由规则比如home首页,list列表页,product详情页
‘’ 或者 #/home 进入home组件
#list/type/1 进入list组件
#/product/2 进入product组件
function router () {
// 根据hash不同决定渲染哪个页面
var str = location.hash;
str = str.slice(1);
str = str.replace(/^\//, '')
// 获取 / 前面的字符串
if (str.indexOf('/') > -1) {
str = str.slice(0, str.indexOf('/'))
}
var map = {
home: true,
list: true,
product: true
}
if (map[str]) {
app.view = str;
} else {
app.view = 'home'
}
}
// 页面进入的时候,会触发load事件
window.addEventListener('load', router)
// hash改变时候的事件交hashChange事件
window.addEventListener('hashchange', router)
注意:在组件中定义数据,这些数据不能直接作为data的属性值,要放在该属性函数中作为返回值。这样才能成功设置绑定数据
在vue的实例化对象中写数据:data后面直接是个{} 就可以获取数据
var app = new Vue({
el: '#app',
data: {
view: ''
}
})
在组件中获取数据 数据作为data对象里面函数的返回值获取。
var HomComponent = Vue.extend({
data: function () {
return {
types: [
{id: 1, title: '美食', url: '01.png'},
{id: 2, title: '电影', url: '02.png'}
]
}
}
})
异步数据的渲染
固定数据我们可以通过同步数据写在文件中
有时候,页面中一些数据,需要需要服务器端传递过来,这一类数据渲染,我们称之为异步数据的渲染
异步数据渲染什么时候请求数据?
当组件渲染完毕,会触发一个created方法,如果这个方法被调用说明这个组件被渲染了
var HomComponent = Vue.extend({
template: Util.tpl('tpl_home'),
data: function () {
return {
types: [
{id: 1, title: '美食', url: '01.png'},
{id: 2, title: '电影', url: '02.png'}
]
}
},
created: function () {
//作用域是组件的实例化对象
/////执行异步数据的获取发ajax
将数据保存在data中使用。往组件的实例化对象中data中添加
}
})
vue中的组件,Component元素,自定义路由,异步数据获取的更多相关文章
- Vue 中的组件
VUE中的组件 一个自定义的标签,vue就会把他看成一个组件,vue可以给这些标签赋予一定意义:一个页面就是一个组件 好处: 1.提高开发效率 2.方便重复使用 3.便于协同开发 4.更容易被管理和维 ...
- 简述vue中父子组件是怎样相互传递值的(基础向)
前言 首先,你需要知道vue中父组件和子组件分别指的是什么? 父组件:vue的根实例——用new Vue()构造函数创建的vue实例(实例会有一个挂载点,挂载点里的所有内容可理解为父组件的内容) ...
- Vue中keep-alive组件的理解
对keep-alive组件的理解 当在组件之间切换的时候,有时会想保持这些组件的状态,以避免反复重渲染导致的性能等问题,使用<keep-alive>包裹动态组件时,会缓存不活动的组件实例, ...
- Vue中父子组件执行的先后顺序
Vera Vue中父子组件执行的先后顺序探讨(转载) 前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看 ...
- Vue中父子组件执行的先后顺序探讨
前几天,朋友向我提出了一个关于Vue中父子组件执行的先后顺序问题,相信很多朋友在学习的过程中也会遇到这个问题,所以我就在此提出我自己的一些小看法. 问题如下:请问下图中父子组件执行的先后顺序? 首先, ...
- Vue中父组件向子组件传值
Vue中父组件向子组件传值 相关Html: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- Vue中,给当前元素添加类名移除兄弟元素类名的方法
在Vue中,给当前元素添加类名移除兄弟元素类名的方法 今天在项目中需要做一个效果,点击对应的li改变当前的color,其他的li取消颜色,在jQuery中这很容易,由于之前已经引入了jQuery,所以 ...
- Vue 中数据流组件
好久不见呀,这两年写了很多很多东西,也学到很多很多东西,没有时常分享是因为大多都是我独自思考.明年我想出去与更多的大神交流,再修筑自己构建的内容. 有时候我会想:我们遇到的问题,碰到的界限,是别人给的 ...
- 解决vue中element组件样式修改无效
vue中element组件样式修改无效 <style> .detail{ .el-input__inner { height: 48px; } } </style> 直接写st ...
随机推荐
- [BZOJ1024][SCOI2009]生日快乐解题报告
Description windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕.现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋 ...
- 会议中心[APIO2009]
会议中心 思路 这一题的正解是倍增的,但是由于我太蒟蒻了,所以我选了一个不算正解但是有可以拿满分的题目学习 思路和我考场上其实差不多,只是我无法实现.... 下面我先来介绍几个数组的用途 1.s,s数 ...
- github 下载某一文件夹
作者:知乎用户链接:https://www.zhihu.com/question/25369412/answer/96174755来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...
- adt 运行时,显示no target selected.
检查adt\adt-bundle-windows-x86-20131030\sdk\system-images下面是否有相关image文件.
- Linux中实现一个简单的进度条【转】
转自:http://blog.csdn.net/yuehailin/article/details/53999288 说起进度条,其实大家常常见到,比如说你在下载视频或文件的时候,提示你当前下载进度的 ...
- [转载]Go的50度灰:Golang新开发者要注意的陷阱和常见错误
初级 开大括号不能放在单独的一行 未使用的变量 未使用的Imports 简式的变量声明仅可以在函数内部使用 使用简式声明重复声明变量 偶然的变量隐藏Accidental Variable Shadow ...
- Bean相关
Bean容器初始化: 本地文件是绝对路径,classpath是相对路径.例子如下: Bean配置项: 常用Bean的配置项: (1)id :在整个IOC容器中,这个bean的唯一标识 (2)class ...
- Tomcat下载安装及常见问题解决办法
一.Tomcat的下载: 下载地址:http://tomcat.apache.org/ 下载Tomcat6.0(在左侧的Download下,考虑到稳定性现在企业大部分还在用Tomcat6.0) (1) ...
- ORM-老师信息系统
老师信息管理 思考 三种方式创建多对多外键方式及其优缺点. 通过外键创建 (自定义第三张表,通过外键与其他两张表关联 但是不能用Django ORM 多对多操作的语法) class Class(mo ...
- hdu 1316(大整数)
How Many Fibs? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...