1,Vue基本语法和概念
2, 打包工具 Webpack , Gulp
3,实战操做html
参考文献:
官网: https://cn.vuejs.org/v2/guide/
官方资料库: https://github.com/vuejs/awes...
全家桶: https://github.com/vuejs/vue-cli
Webpack全家桶文档: http://vuejs-templates.github...
Vue Router: https://router.vuejs.org/
Vuex: https://vuex.vuejs.org/
Vue-resource: https://github.com/pagekit/vu...
Element-UI: http://element.eleme.io/#/zh-CN前端
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <!-- 1. 导入Vue的包 --> <script src="./lib/vue-2.4.0.js"></script> </head> <body> <!-- 未来 new 的Vue实例,会控制这个 元素中的全部内容 --> <!-- Vue 实例所控制的这个元素区域,就是咱们的 V --> <div id="app"> <p>{{ msg }}</p> </div> <script> // 2. 建立一个Vue的实例 // 当咱们导入包以后,在浏览器的内存中,就多了一个 Vue 构造函数 // 注意:咱们 new 出来的这个 vm 对象,就是咱们 MVVM中的 VM调度者 var vm = new Vue({ el: '#app', // 表示,当前咱们 new 的这个 Vue 实例,要控制页面上的哪一个区域 // 这里的 data 就是 MVVM中的 M,专门用来保存 每一个页面的数据的 data: { // data 属性中,存放的是 el 中要用到的数据 msg: '欢迎学习Vue', // 经过 Vue 提供的指令,很方便的就能把数据渲染到页面上,程序员再也不手动操做DOM元素了 //【前端的Vue之类的框架,不提倡咱们去手动操做DOM元素了】 } }) </script> </body> </html>
v-cloak
可以解决 插值表达式闪烁的问题v-text
会覆盖元素中本来的内容,可是插值表达式 只会替换本身的这个占位符,不会把 整个元素的内容清空.v-html
能够解析表达式中的<h2>等html标签用于绑定属性的指令,例如给input
标签下的 title 绑定 属性show
,使得鼠标放置在按钮时呈现show
中的内容vue
<input type="button" value="按钮" v-bind:title="show">
鼠标放置在按钮时,将显示“这是一个本身定义的titile”webpack
var vm = new Vue({ el: '#app', data: { msg: '123', msg2: '<h1>哈哈,我是一个大大的H1, 我大,我骄傲</h1>', show: '这是一个本身定义的title' },
ps. v-bind 中,能够写合法的JS表达式,所以能够在后面添加表达式,好比v-bind:title='show+'123'';
注意: v-bind: 指令能够被简写为 :要绑定的属性git
:title='show+'123'';
v-on
指令定义Vue中的事件在不操做DOM的状况下,实现事件绑定机制程序员
<input type="button" name="" id="" value="按钮" v-on:click="zxc"/>
ps. 一样的 v-on 能够简写为 @github
methods: { // 这个 methods属性中定义了当前Vue实例全部可用的方法 zxc: function () { alert('Hello') } }
难点:web
分析:vuex
1. 给 【浪起来】 按钮,绑定一个点击事件 `v-on` @ 2. 在按钮的事件处理函数中,写相关的业务逻辑代码:拿到 msg 字符串,而后 调用 字符串的 substring 来进行字符串的截取操做,把 第一个字符截取出来,放到最后一个位置便可; 3. 为了实现点击下按钮,自动截取的功能,须要把 2 步骤中的代码,放到一个定时器中去;
<!-- 2. 建立一个要控制的区域 --> <div id="app"> <input type="button" value="浪起来" @click="lang"> <input type="button" value="低调" @click="stop"> <h4>{{ msg }}</h4> </div> <script> // 注意:在 VM实例中,若是想要获取 data 上的数据,或者 想要调用 methods 中的 方法,必须经过 this.数据属性名 或 this.方法名 来进行访问,这里的this,就表示 咱们 new 出来的 VM 实例对象 var vm = new Vue({ el: '#app', data: { msg: '猥琐发育,别浪~~!', intervalId: null // 在data上定义 定时器Id }, methods: { lang() { // console.log(this.msg) // 获取到头的第一个字符 // this if (this.intervalId != null) return; this.intervalId = setInterval(() => { var start = this.msg.substring(0, 1) // 获取到 后面的全部字符 var end = this.msg.substring(1) // 从新拼接获得新的字符串,并赋值给 this.msg this.msg = end + start }, 400) // 注意: VM实例,会监听本身身上 data 中全部数据的改变,只要数据一发生变化,就会自动把 最新的数据,从data 上同步到页面中去;【好处:程序员只须要关心数据,不须要考虑如何从新渲染DOM页面】 }, stop() { // 中止定时器 clearInterval(this.intervalId) // 每当清除了定时器以后,须要从新把 intervalId 置为 null this.intervalId = null; } } })
.stop
阻止冒泡点击button按钮时,控制台只输出 button 的点击事件,不会捕获<div>中的事件vue-cli
<div id="" class="inner" @click="div1Handler"> <input type="button" name="" id="" value="点击它" @click.stop="btnHandler"/> </div>
.prevent
阻止默认事件tx事件被阻止,页面不会跳转
<a href="http://www.qq.com" @click.prevent='tx'>腾讯网</a>
.capture
添加事件监听器时使用事件捕获模式.stop 是阻止冒泡,也就是说阻止外表事件的发生。而.capture是让外部事件先发生
点击按钮时先触发空间背景事件。
只能放在元素自己;当下面代码中的.self放在input当中时,依旧会发生冒泡事件
<div id="" class="inner" @click.self="div1Handler"> <input type="button" name="" id="" value="点击它" @click="btnHandler"/> </div>
.once
事件只触发一次只触发一次事件处理函数
<a href="http://www.qq.com" @click.once='tx'>腾讯网</a>
v-model
和数据双向绑定v-bind
只能实现数据的单线绑定,从M层绑定到V层;v-model
只能用在表单元素中
其中包括:input(redio,text.address,email...) select checkbox textarea
<div id="app-6"> <p>{{ message }}</p> <input v-model="message"> </div>
var app6 = new Vue({ el: '#app-6', data: { message: 'Hello Vue!' } })
定义3个input标签text属性,1个select标签
<div id="app"> <input type="text" v-model="n1"> <select v-model="opt"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> <input type="text" v-model="n2"> <input type="button" value="=" @click="calc"> <input type="text" v-model="result"> </div>
在data下定义事件,初始化值。能够选用switch作判断循环;也可使用 eval方案(该方法可直接判断加减乘除符号)
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: { n1: 0, n2: 0, result: 0, opt: '+' }, methods: { calc() { // 计算器算数的方法 // 逻辑: /* switch (this.opt) { case '+': this.result = parseInt(this.n1) + parseInt(this.n2) break; case '-': this.result = parseInt(this.n1) - parseInt(this.n2) break; case '*': this.result = parseInt(this.n1) * parseInt(this.n2) break; case '/': this.result = parseInt(this.n1) / parseInt(this.n2) break; } */ // 注意:这是投机取巧的方式,正式开发中,尽可能少用 var codeStr = 'parseInt(this.n1) ' + this.opt + ' parseInt(this.n2)' this.result = eval(codeStr) } } }); </script>
如下例子将的将于此代码,为方便理解在此展现出来
<style> .red { color: red; } .thin { font-weight: 200; } .italic { font-style: italic; } .active { letter-spacing: 0.5em; } </style>
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: { flag: true, classObj: { red: true, thin: true, italic: false, active: false } }, methods: {} }); </script>
ps.传统实现方式: <h1 :class="['red', 'thin']">这是一个邪恶的H1</h1>
第一种使用方式,直接传递一个数组,注意: 这里的 class 须要使用 v-bind
作数据绑定
<h1 :class="['red', 'thin']">这是一个邪恶的H1</h1>
当flag为真时,执行active样式,不然不执行
<h1 :class="['red', 'thin', flag?'active':'']">这是一个邪恶的H1</h1>
<h1 :class="['thin', 'italic', {'active':flag} ]">
class
属性时,这些类将被添加到该组件的根元素上面。这个元素上已经存在的类不会被覆盖<h1 :class="{red:true, italic:true, active:true, thin:true}">这是一个邪恶的H1</h1>
能够在class
中直接写,也能够将对象写在data
中,直接引用其属性.
<h1 :class="classObj">这是一个很大很大的H1,大到你没法想象!!!</h1>
:style
的形式,书写样式对象<h1 :style="{color: 'red', 'font-size': '40px'}">这是一个善良的H1</h1>
data
中,并直接引用到 :style
中data: { h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' } }
<h1 :style="h1StyleObj">这是一个善良的H1</h1>
:style
中经过数组,引用多个 data
上的样式对象data: { h1StyleObj: { color: 'red', 'font-size': '40px', 'font-weight': '200' }, h1StyleObj2: { fontStyle: 'italic' } }
<h1 :style="[h1StyleObj, h1StyleObj2]">这是一个善良的H1</h1>
v-for
和key
ps.在使用2.X以上的版本时,key属性是必须有的
<div id="app"> <p v-for="(item, i) in list">索引值:{{i}} --- 每一项:{{item}}</p> </div>
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: { list: [1, 2, 3, 4, 5, 6] }, methods: {} }); </script>
<div id="app"> <p v-for="(user, i) in list">Id:{{ user.id }} --- 名字:{{ user.name }} --- 索引:{{i}}</p> </div>
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: { list: [ { id: 1, name: 'zs1' }, { id: 2, name: 'zs2' }, { id: 3, name: 'zs3' }, { id: 4, name: 'zs4' } ] }, methods: {} }); </script>
<div id="app"> <!-- 注意:在遍历对象身上的键值对的时候, 除了 有 val key ,在第三个位置还有 一个 索引 --> <p v-for="(val, key, i) in user">值是: {{ val }} --- 键是: {{key}} -- 索引: {{i}}</p> </div>
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: { user: { id: 1, name: '托尼·屎大颗', gender: '男' } }, methods: {} }); </script>
<div id="app"> <!-- in 后面咱们放过 普通数组,对象数组,对象, 还能够放数字 --> <!-- 注意:若是使用 v-for 迭代数字的话,前面的 count 值从 1 开始 --> <p v-for="count in 10">这是第 {{ count }} 次循环</p> </div>
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: {}, methods: {} }); </script>
v-for
中的key属性<div id="app"> <div> <label>Id: <input type="text" v-model="id"> </label> <label>Name: <input type="text" v-model="name"> </label> <input type="button" value="添加" @click="add"> </div> <!-- 注意: v-for 循环的时候,key 属性只能使用 number获取string --> <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 --> <!-- 在组件中,使用v-for循环的时候,或者在一些特殊状况中,若是 v-for 有问题,必须 在使用 v-for 的同时,指定 惟一的 字符串/数字 类型 :key 值 --> <p v-for="item in list" :key="item.id"> <input type="checkbox">{{item.id}} --- {{item.name}} </p> </div>
<div id="app"> <div> <label>Id: <input type="text" v-model="id"> </label> <label>Name: <input type="text" v-model="name"> </label> <input type="button" value="添加" @click="add"> </div> <!-- 注意: v-for 循环的时候,key 属性只能使用 number获取string --> <!-- 注意: key 在使用的时候,必须使用 v-bind 属性绑定的形式,指定 key 的值 --> <!-- 在组件中,使用v-for循环的时候,或者在一些特殊状况中,若是 v-for 有问题,必须 在使用 v-for 的同时,指定 惟一的 字符串/数字 类型 :key 值 --> <p v-for="item in list" :key="item.id"> <input type="checkbox">{{item.id}} --- {{item.name}} </p> </div>
v-if
和 v-show
<div id="app"> <!-- <input type="button" value="toggle" @click="toggle"> --> <input type="button" value="toggle" @click="flag=!flag"> <!-- v-if 的特色:每次都会从新删除或建立元素 --> <!-- v-show 的特色: 每次不会从新进行DOM的删除和建立操做,只是切换了元素的 display:none 样式 --> <!-- v-if 有较高的切换性能消耗 --> <!-- v-show 有较高的初始渲染消耗 --> <!-- 若是元素涉及到频繁的切换,最好不要使用 v-if, 而是推荐使用 v-show --> <!-- 若是元素可能永远也不会被显示出来被用户看到,则推荐使用 v-if --> <h3 v-if="flag">这是用v-if控制的元素</h3> <h3 v-show="flag">这是用v-show控制的元素</h3> </div>
<script> // 建立 Vue 实例,获得 ViewModel var vm = new Vue({ el: '#app', data: { flag: false }, methods: { /* toggle() { this.flag = !this.flag } */ } }); </script>