Vue2简单入门

Vue.js 简介

Vue.js是当下很火的一个JavaScript MVVM库,它是以数据驱动和组件化的思想构建的。
其和jQuery最大的不同点在于jQuery通过操作DOM来改变页面的显示,而Vue通过操作数据来实现页面的更新与展示。

所以如果你之前已经习惯了用jQuery操作DOM,学习Vue.js时请先抛开手动操作DOM的思维,因为Vue.js是数据驱动的,你无需手动操作DOM。

当然了,在使用Vue.js时,你也可以结合其他库一起使用,比如jQuery。

Vue数据驱动的概念模型

概念模型

Vue.js主要负责的是上图绿色正方体ViewModel的部分,其在View层(即DOM层)与Model层(即JS逻辑层)之间通过ViewModel绑定了DOM Listeners与Data Bingings两个相当于监听器的东西。

当View层的视图发生改变时,Vue会通过DOM Listeners来监听并改变Model层的数据。相反,当Model层的数据发生改变时,其也会通过Data Bingings来监听并改变View层的展示。这样便实现了一个双向数据绑定的功能,也是Vue.js数据驱动的原理所在。


Hello World示例

html代码

<!--这是我们的View-->
 <div id="app">
   {{ message }}
 </div>

javascript代码

// 这是我们的Model 
var exampleData = {
  message: 'Hello World!'
} 
// 创建一个的 Vue 实例或 "ViewModel" 并给它赋值给变量vm
// 它连接 View 与 Model 
var vm=new Vue({ 
  el: '#app',
  data: exampleData,
  methods:{
change:function(){
 this.message="Hello Vue.js!"
}
   
  }
})

预览地址

在一个html文件中,我们直接可以通过script标签引入Vue.js,然后就可以在页面里写vue.js代码了。
上面示例中我们通过new Vue({})构建了一个Vue的实例,在示例中,可以包含挂在元素(el),数据(data),模板(template),方法(methods)与生命周期钩子(created等)等选项。
不同的实例选项拥有不同的功能,常用选项有:
(1)el:表明我们的Vue需要操作哪一个元素下的区域,’#app’表示操作id为app的元素下区域。
(2)data:表示Vue 实例的数据对象,data 的属性能够响应数据的变化。
(3)computed:计算属性,详见官网:计算属性
(4)methods:方法对象,可以通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this自动绑定为 Vue 实例。
(5)components:组件对象
(6)生命周期钩子方法,如:created(实例已经创建完成之后被调用)、mounted(el
被新创建的 vm.$el
替换,并挂载到实例上去之后调用该钩子)

Vue.js生命周期钩子方法

Vue.js常用指令

在Vue项目的开发中,我们使用的最多的应该就属Vue的指令了。通过Vue提供的以v-开头的常用指令,我们可以淋漓尽致地发挥Vue数据驱动的强大功能。以下代码中常用指令的简单介绍:

<div id="app">
  <p v-text="p1"></p>
  <p v-html="p2"></p>
  <p v-if="p3">p3</p>
  <p v-else>p4</p>
  <p v-show="p5">p5</p>
  <p v-for="p in p6"></p>
  <p v-on:click="showP3">showP3</p>
  <p v-bind:title="p7">{{p7}}</p>
  <input v-model="p8" />
  <p v-cloak>{{p9}}</p>
 </div>

(1)v-text: 用于更新绑定元素中的内容,类似于jQuery的text()方法

//可以使用插值'{{}}'替代
<p>{{p1}}</p>

(2)v-html: 用于更新绑定元素中的html内容,类似于jQuery的html()方法
(3)v-if: 用于根据表达式的值的真假条件渲染元素,如果示例代码中P3为false则不会渲染p3标签,语法如下:

v-if="expression"

(4)v-show: 用于根据表达式的值的真假条件�显示隐藏元素,切换元素的 display CSS 属性
(5)v-else:必须紧跟在 v-ifv-show元素的后面——否则它不能被识别。
(6)v-for: 用于遍历数据渲染元素或模板,如示例代码中P6为[1,2,3]则会渲染3个P标签,内容依次为1,2,3

//可以为数组索引指定别名(或者用于对象的键):
<div v-for="(item, index) in items"></div>
<div v-for="(val, key) in object"></div>
<div v-for="(val, key, index) in object"></div>

(7)v-on: 用于在元素上绑定事件,示例代码中在P标签上绑定了showP3的点击事件

<!-- 方法处理器 -->
<button v-on:click="doThis"></button>

<!-- 内联语句 -->
<button v-on:click="doThat('hello', $event)"></button>

<!-- 缩写 -->
<button @click="doThis"></button>

<!-- 停止冒泡 -->
<button @click.stop="doThis"></button>

<!-- 阻止默认行为 -->
<button @click.prevent="doThis"></button>

<!-- 阻止默认行为,没有表达式 -->
<form @submit.prevent></form>

<!-- 串联修饰符 -->
<button @click.stop.prevent="doThis"></button>

<!-- 键修饰符,键别名 -->
<input @keyup.enter="onEnter">

<!-- 键修饰符,键代码 -->
<input @keyup.13="onEnter">

(8)v-bind:用于在元素上的绑定属性

<!-- 绑定一个属性 -->
![](imageSrc)

<!-- 缩写 -->
![](imageSrc)

<!-- class 绑定 -->
<div :class="{ red: isRed }"></div>
<div :class="[classA, classB]"></div>
<div :class="[classA, { classB: isB, classC: isC }]">

<!-- style 绑定 -->
<div :style="{ fontSize: size + 'px' }"></div>
<div :style="[styleObjectA, styleObjectB]"></div>

<!-- 绑定一个有属性的对象 -->
<div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

<!-- 通过 prop 修饰符绑定 DOM 属性 -->
<div v-bind:text-content.prop="text"></div>

<!-- prop 绑定. “prop” 必须在 my-component 中声明。 -->
<my-component :prop="someThing"></my-component>

<!-- XLink -->
<svg><a :xlink:special="foo"></a></svg>

(9)v-model:用于在表单控件元素上创建双向数据绑定
示例

(10)其他指令:
v-cloak(这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none }
一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。)、
v-once(只渲染元素和组件一次)

指令综合示例


Vue.js组件

组件(Component)是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素, Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以是原生 HTML 元素的形式,以 is 特性扩展。

全局组件注册

全局组件可以在任意Vue实例下使用

/** 全局组件注册方式 */

/** js代码 ==========*/
// 注册组件,传入一个扩展过的构造器
Vue.component('my-component', Vue.extend({
  "template":"<div>This is a component! data:{{data}}</div>"
}))
// 或者
// 注册组件,传入一个选项对象(自动调用 Vue.extend)
Vue.component('my-component',{
  "template":"<div>This is a component! data:{{data}}</div>"
})

// 实例
new Vue({
  el:"#app",
})
new Vue({
  el:"#app2",
})

/** html代码 ==========*/
<div id="app">
  <my-component></my-component>  //输出"<div>This is a component! </div>
</div>

<div id="app2">
  <my-component></my-component>  //输出"<div>This is a component! </div>
</div>

局部组件注册

如果不需要全局注册,或者是让组件使用在其它组件内,可以用选项对象的components属性实现局部注册

/** 局部组件注册方式 */

/** js代码 */
// 注册组件,传入一个扩展过的构造器
var MyComponent=Vue.extend({
  "template":"<div>This is a component! data:{{data}}</div>"
});
// 或者
// 注册组件,传入一个选项对象(自动调用 Vue.extend)
var MyComponent={
  "template":"<div>This is a component! data:{{data}}</div>"
};

// 实例
new Vue({
  el:"#app",
  components:{"my-component":MyComponent  }//MyComponent只能在#app实例下使用,在其他实例或者组件内不会渲染
})

/** html代码 */
<div id="app">
  <my-component></my-component>  //输出"<div>This is a component!</div>
</div>

组件间的数据传递

组件实例的作用域是孤立的。这意味着不能并且不应该在子组件的模板内直接引用父组件的数据。

使用 props 选项接收父组件数据

prop 是父组件用来传递数据的一个自定义属性。子组件需要显式地用 [props 选项]声明 “prop”:

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

然后向它传入一个普通字符串:

<child message="hello!"></child>
//或者作用v-bind绑定动态props 
<child :message="message"></child>

结果

使用自定义事件修改父组件数据

-使用v-on指令绑定自定义事件

每个 Vue 实例都实现了事件接口(Events interface),即:

  • 使用 $on(eventName) 监听事件
  • 使用 $emit(eventName) 触发事件

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。
下面是一个例子:

<div id="counter-event-example">
  <p>{{ total }}</p>
  <button-counter v-on:increment="incrementTotal"></button-counter>
  <button-counter v-on:increment="incrementTotal"></button-counter>
</div>
Vue.component('button-counter', {
  template: '<button v-on:click="increment">{{ counter }}</button>',
  data: function () {
    return {
        counter: 0
    }
  },
  methods: {
      increment: function () {
      this.counter += 1
      this.$emit('increment')  //触发v-on绑定的increment事件
    }
  },
})

new Vue({
  el: '#counter-event-example',
  data: {
  total: 0
  },
  methods: {
    incrementTotal: function () {
      this.total += 1
    }
  }
});

示例

非父子组件通信

有时候非父子关系的组件也需要通信。在简单的场景下,使用一个空的 Vue 实例作为中央事件总线:

var bus = new Vue()
// 触发组件 A 中的事件
bus.$emit('id-selected', 1)
// 在组件 B 创建的钩子中监听事件
bus.$on('id-selected', function (id) {
// ...
})

结语

本文简单介绍了Vue.js的MVVM模型和它的双向绑定机制,然后介绍了Vue.js常用的选项及指令的用法,接着了解了在Vue.js里面全局和局部组件的创建方式以及父子组件和非父子组件之间的数据通讯。通过全篇介绍对Vue.js用法有了大概了解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,302评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,563评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,433评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,628评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,467评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,354评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,777评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,419评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,725评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,768评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,543评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,387评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,794评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,032评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,305评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,741评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,946评论 2 336

推荐阅读更多精彩内容

  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 5,042评论 0 29
  • 转载 :OpenDiggawesome-github-vue 是由OpenDigg整理并维护的Vue相关开源项目库...
    果汁密码阅读 23,073评论 8 124
  • Vue 实例 属性和方法 每个 Vue 实例都会代理其 data 对象里所有的属性:var data = { a:...
    云之外阅读 2,193评论 0 6
  • 教我如何不想念 午夜未眠 朝朝暮暮两不见 叫我如何不想念 打开空间 你已离线 教我如何不想念 一年又一年 离别还徘...
    瞿静阅读 195评论 0 0
  • 今天是来赢家后第一次参加拜师,袁导说拜师不仅是对师傅的尊重更是内心一种臣服! 师傅、徒弟这两种身份都意味着责任,一...
    夢瑤阅读 209评论 0 0