一、vue的特点

1、响应式的数据绑定(一旦修改了数据,立马更新视图)

  • 数据驱动思想 (数据到视图的映射、操作数据改变视图、简化对DOM的操作)
  • 追踪依赖变化 (  Object.defineProperty 、watcher 实例对象)

   把一个普通 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。Object.defineProperty 是仅 ES5 支持,且无法 shim 的特性,这也就是为什么 Vue 不支持 IE8 以及更低版本浏览器的原因。 

  每个组件实例都有相应的 watcher 实例对象,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的 setter 被调用时,会通知 watcher 重新计算,从而致使它关联的组件得以更新。 

2、可组合的视图组件

  把视图按照功能,切分若干基本单元;组件可以一级一级组合成整个应用,形成了倒置的组件树。

  使用组件的好处:可维护、可重用、可测试。

  注意:一个组件中只能有一个顶层标签;

      实例中的data是对象,组件中的data是函数。因为组件中的data如果以对象的形式存在,会被其它组件共用。

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style>
[v-cloak] {
display: none;
}
       /*v-clock 隐藏未编译的mustach*/
        </style>
<script src="./js/vue.js"></script>
</head> <body>
<!-- 模板 view-->
<div id="app" v-cloak>
<custom-com></custom-com>
<custom-com2></custom-com2>
<custom-coms></custom-coms>
</div>
<script>
//定义组件
Vue.component('custom-com',{
data(){
return {
test:"hello"
}
},
template:`
<div>我是组件{{test}}</div>
`
}) Vue.component('custom-com2',{
data(){
return {
test:"hello"
}
},
template:`
<div>
<div>我是组件-custom-com2{{test}}</div>
<input type="button" value="改变数据"
@click="test=123"
/>
</div>
`
})
// 数据 model
var data = {
message: 'hello,miaov.com'
};
// vm view-model
var vm = new Vue({
el: "#app",
data: data,
components:{
'custom-coms': {
template:`
<div>我是局部组件</div>
`
}
}
}); </script>
</body>
</html>

二、vue实例

  每个vue.js应用都是通过构造函数vue创建一个vue的根实例启动的:

new Vue({
//选项
})
选项参数:el data methods computed watch template

  methods 处理纯粹的逻辑 而不是处理dom操作细节 例如 keyup 等; model 用的oninput 进行监听的 而angular 用的脏值检查。

三、vue实例生命周期

  vue实例从创建到销毁的过程,就是生命周期。

钩子函数:

beforeCreate:数据绑定前; created:数据绑定后;beforeMount:挂载之前;mounted:挂载之后;

beforeUpdate:更新之前;  updated:更新之后;   beforeDestroy:销毁前;destroyed: 销毁后;

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style>
[v-cloak] {
display: none;
}
</style>
<script src="./js/vue.js"></script>
</head> <body>
<!-- 模板 view-->
<div id="loading">loading....</div>
<div id="app" v-cloak>
{{message}}
<div>1111</div>
</div>
<script>
// 数据 model
var data = {
message: ''
};
// vm view-model
var vm = new Vue({
data: data,
beforeCreate(){
console.log("数据绑定前");
console.log(this.message );
console.log("-------------------");
},
created(){
console.log("数据绑定后");
console.log( this.message );
console.log( this.$el );
console.log("-------------------");
},
beforeMount(){
console.log("挂载之前");
console.log( this.$el );
console.log("-------------------");
},
mounted(){
console.log("挂载之后");
console.log( this.$el );
console.log("-------------------"); loading.style.display = 'none'; //获取数据 发送ajax请求
setTimeout( () => {
var obj = {message:"我是从服务端来得"}
this.message = obj.message;
},2000)
},
beforeUpdate(){
console.log("更新之前");
console.log( this.message );
console.log("-------------------");
},
updated (){
console.log("更新之后");
console.log( this.message );
console.log("-------------------");
},
beforeDestroy(){
console.log("销毁前");
console.log("-------------------");
},
destroyed(){
console.log("销毁后");
}
}); vm.$mount("#app"); /*setTimeout(function (){
vm.message = 'hello';
vm.$mount("#app");
},2000)*/ </script>
</body>
</html>

钩子函数(可理解为回调函数)其中的this 指向当前的实例对象;

$mount 推迟到未来的某个点挂载你的应用

mount的作用: 1推迟挂载点  2发送ajax请求

四、组件中的通信

1、使用prop传递数据

  组件实例的作用域是孤立的。这意味着不能(也不应该)在子组件的模板内直接引用父组件的数据。要让子组件使用父组件的数据,我们需要通过子组件的props选项。

  子组件要显式地用 props 选项声明它期待获得的数据。

Vue.component('child', {
// 声明 props
props: ['message'],
// 就像 data 一样,prop 可以用在模板内
// 同样也可以在 vm 实例中像 “this.message” 这样使用
template: '<span>{{ message }}</span>'
})

  然后我们可以这样向它传入一个普通字符串:

<child message="hello!"></child>

  在模板中,要动态地绑定父组件的数据到子模板的props,与绑定到任何普通的HTML特性相类似,就是用 v-bind。每当父组件的数据变化时,该变化也会传导给子组件:

<div>
<input v-model="parentMsg">
<br>
<child v-bind:my-message="parentMsg"></child>
</div>
<child :my-message="parentMsg"></child>

  prop 是单向绑定的:当父组件的属性变化时,将传导给子组件,但是不会反过来。这是为了防止子组件无意修改了父组件的状态——这会让应用的数据流难以理解。

  另外,每次父组件更新时,子组件的所有 prop 都会更新为最新值。这意味着你不应该在子组件内部改变 prop 。如果你这么做了,Vue 会在控制台给出警告。

2、组件间通信

  • 父组件-->子组件  使用prop传递
  • 子组件-->父组件  自定义事件

  

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title></title>
<style>
[v-cloak] {
display: none;
}
</style>
<script src="./js/vue.js"></script>
</head> <body>
<!-- 模板 view-->
<div id="app" v-cloak>
<custom-com :test="abc" @abc-change="abcHandle"></custom-com>
<custom-com test="miaov"></custom-com>
</div>
<script>
//定义组件
Vue.component('custom-com',{
props:["test"],
data(){
return {
value: this.test
}
},
template:`
<div>
<p>test:{{test}}</p>
<p>value:{{value}}</p>
<input type="button" @click="value=123" />
<input type="button" value="通知父组件" @click="changeAbc" />
</div>
`,
methods:{
changeAbc(){
// this.test = 10;
this.$emit("abc-change",10)
}
}
}) // 数据 model
var data = {
message: 'hello,miaov.com',
abc:"hello"
};
// vm view-model
var vm = new Vue({
el: "#app",
data: data,
methods:{
abcHandle(newValue){
console.log("子组件改数据了");
console.log(newValue);
this.abc = newValue
}
}
});
</script>
</body>
</html>






vue(三)的更多相关文章

  1. MVVM 和 VUE三要素:响应式、模板引擎、渲染

    MVVM 和 VUE三要素:响应式.模板引擎.渲染:https://blog.csdn.net/weixin_37644989/article/details/94409430

  2. 一步一步学Vue(三)

    接上篇,有同事看了我写的博客,觉得我这人不靠谱,文笔太白了,不够严肃,所以这次我一定要做一个严肃的人,写博客要有写博客的态度,第三篇开始我在考虑一个问题,会不会太着急了,要知道Vue的组件化时它的一个 ...

  3. Vue (三) --- Vue 组件开发

    ------------------------------------------------------------------好心情,会让你峰回路转. 5. 组件化开发 5.1 组件[compo ...

  4. Vue(三)之前端路由

    01-前端路由 1.前端路由的实现原理 vue+vue-router 主要来做单页面应用(Single Page Application) 为什么我们要做单页面应用? (1)传统的开发方式 url改变 ...

  5. Vue(三) v-bind 及 class 与 style 绑定

    DOM 元素经常会动态绑定一些 class 类名 或 style 样式,现在介绍使用 v-bind 指令来绑定 class 和 style 的多种方法. 了解 v-bind 指令 在之前已经介绍了指令 ...

  6. vue三要素及底层实现机制

    深入解析Vue 我们首先来熟悉一下我们这个文档所学习内容的流程. 先对比一下jQuery和Vue的区别,再讲述Vue的MVVM模型,接着讲解Vue的实现流程. 当然,我是不相信没有对比哪来的伤害,没有 ...

  7. Vue三步完成跨域请求

    三步完成跨域请求 ①main.js中: Vue.prototype.HOME = '/api'; ② config/index.js中: module.exports = { dev: { // Pa ...

  8. VUE三 vue-router(路由)详解

    前端路由 根据不同的 url 地址展示不同的内容或页面,无需依赖服务器根据不同URL进行页面展示操作 优点 用户体验好,不需要每次都从服务器全部获取,快速展现给用户 缺点 使用浏览器的前进,后退键的时 ...

  9. 从零开始学习Vue(三)

    我们从一个例子来学习组件,vuejs2.0实战:仿豆瓣app项目,创建自定义组件tabbar 这个例子用到其他组件,对于初学者来说,一下子要了解那么多组件的使用,会变得一头雾水.所以我把这个例子改写了 ...

随机推荐

  1. request中的那些方法到底是干什么的?

    最近做Java Web项目,在.jsp页面和servlet之间request和response还是有些混淆,查阅了一些资料,总结如下,方便以后使用: 首先,servlet接口是最基本的,提供的五个方法 ...

  2. 阿里云Linux服务器,挂载硬盘并将系统盘数据迁移到数据盘

    因为之前用宝塔上线,宝塔只挂载了系统盘50G,打开阿里云云盘列表发现系统盘无法直接升级,故另买一块数据盘挂载到Linux服务器下,下面根据网上教程再结合我实际情况讲解一下实际操作,其实非常easy l ...

  3. 深入理解yii2之RBAC(模块化系统)

    一.前言 上一篇文章我们已经大致谈过RBAC到底是什么和yii2底层RBAC接口的分析. 下面我深入理解一下RBAC权限分配,深入理解下yii2底层RBAC扩展,以及它是如何针对模块化系统的开发的? ...

  4. Django+vue在腾讯云上搭建前后端分离项目

    最近打算用Django+vue搭建一个个人主站,在此记录一下搭建项目的整个过程. 一 开发环境: 腾讯云Centos     7 Python                3.7 Django    ...

  5. Skyscrapers Covered in Solar Pancels【太阳能电池板覆盖的摩天大楼】

    Skyscrapers Covered in Solar Panels An office tower on Miller Stree in Manchester is completely cove ...

  6. B1086 就不告诉你 (15分)

    B1086 就不告诉你 (15分) 做作业的时候,邻座的小盆友问你:"五乘以七等于多少?"你应该不失礼貌地围笑着告诉他:"五十三."本题就要求你,对任何一对给定 ...

  7. POJ:2395-Out of Hay

    Out of Hay Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18780 Accepted: 7414 Descripti ...

  8. 基于HDP版本的YDB安装部署(转)

    第三章 YDB依赖环境准备 一.硬件环境 硬件如何搭配,能做到比较高的性价比,不存在短板.合理的硬件搭配,对系统的稳定性也很关键. 1.CPU不是核数越高越好,性价比才是关键. 经常遇到很多的企业级客 ...

  9. SharpCompress的压缩文件解压和文件夹压缩

    1.前言 最近做一个功能需要用到对压缩文件的解压,就找到了这个SharpCompress不错,还能解压rar的文件.但是网上的资料和我拿到的SharpCompress.dll的方法有些出入,所以我就自 ...

  10. css媒体类型

    all 用于所有的媒体设备. aural 用于语音和音频合成器. braille 用于盲人用点字法触觉回馈设备. embossed 用于分页的盲人用点字法打印机. handheld 用于小的手持的设备 ...