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 ...
随机推荐
- C# 文件类的操作---获取
如何获取指定目录包含的文件和子目录 . DirectoryInfo.GetFiles():获取目录中(不包含子目录)的文件,返回类型为FileInfo[],支持通配符查找: . DirectoryIn ...
- java List排序 顺序 倒序 随机
List list = new LinkedList(); for ( int i = 0 ; i < 9 ; i ++ ) { list.add( " a " + i); ...
- from表单详解
- python3 面向对象补充
f = People('egon',18,'male') 非函数hasattr # hasattr(f,'name')getattr # getattr(f,'name')setattr # seta ...
- 使用MXNet远程编写卷积神经网络用于多标签分类
最近试试深度学习能做点什么事情.MXNet是一个与Tensorflow类似的开源深度学习框架,在GPU显存利用率上效率高,比起Tensorflow显著节约显存,并且天生支持分布式深度学习,单机多卡.多 ...
- OpenCV 3.0中IplImage* 转cv::Mat
在OpenCV 2.0中使用: IplImage * ipl1, *ipl2; // ... const cv::Mat m = cv::Mat(ipl,false); cv::Mat m2 = ip ...
- Android 用AsyncTask下载网络图片并显示百分比
1.添加布局文件:activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a ...
- ros bashrc 无法source setup.sh
不知道什么时候开始的,莫名其妙首先是QT闪退,无法找到头文件,然后命令行进去catkin无法提示catkin_make 手动source之后就好了 问题出现在bashrc中source失败了 所以检查 ...
- 【hdoj_2037】今年暑假不AC
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2037 可以这样理解题意:将每个节目看做是一个区间,起始时间为左右端点,待求的是:最多可以有多少个区间互不相 ...
- Laravel跳转回之前页面,并携带错误信息
用Laravel5.1开发项目的时候,经常碰到需要携带错误信息到上一个页面,开发web后台的时候尤其强烈. 直接上: 方法一:跳转到指定路由,并携带错误信息 return redirect('/adm ...