0. Vue简介 1. Vue是什么?
是一套用于构建用户界面的渐进式框架 。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链 以及各种支持类库 结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。
构建用户界面:将手中的数据通过某种方法, 变成用户可以看到的界面
渐进式:Vue是可以自底向上逐层的应用.如果为简单应用,只需要一个轻量小巧的核心库,如果为复杂应用,可以引用各式各样的 Vue插件. 也就是从一个轻量小巧的核心库,逐渐递进到Vue插件库
2.由谁开发? 沈雨溪
3. Vue的特点
采用组件化模式, 提高代码复用率,且让代码更好维护.
组件化:一个页面中可能有多个模块,可将模块分成不同的XXX.Vue页面书写,封装成组件
声明式编码,让编码人员无需直接操作DOM, 提高开放效率
使用虚拟DOM+优秀的DIff算法,尽量复用DOM节点
4. Vue2官网指南使用
https://v2.cn.vuejs.org/
顶部导航——学习——教程&API:最重要的两个部分(API相当于是Vue的字典);
顶部导航——学习——风格指南:写出更加优雅的代码,有优先级A(必要的)、B(强烈推荐)、C(推荐)等;
顶部导航——学习——Cookbook:Vue的使用技巧;
顶部导航——生态系统——帮助&信息:不重要,可不看;
顶部导航——生态系统——工具&插件:重要,后期需要,如脚手架、路由等:
5. 搭建Vue开发环境
下载引入开发版本的Vue.js
最开始使用Vue不推荐Vue-cli的方式,开始使用的是在.html中引入Vue。
安装开发者工具
https://devtools.vuejs.org/guide/installation.html
关闭提示
全局配置vue.config,去除提示
1 Vue.config.productionTip=false
未必生效,若不生效,直接修改vue.js源码即可
1. Vue基础部分 1.1 Vue程序初体验 01-第一个Vue程序 hello Word!示例代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <!DOCTYPE html > <html lang ="zh-CN" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 第一个Vue程序</title > <script src ="../js/vue.js" > </script > </head > <body > <hr > <div id ="app" > </div > <script > const vm = new Vue ({ template : '<h1>Hello Vue!!!!!</h1>' }) myVue.$mount('#app' ) </script > </body > </html >
02-模版语句的数据来源 模版语句的数据来源 :
谁可以给模版语句提供数据支持呢? data选项
data选项的类型是什么? Object | Function (对象或者函数)
data配置项的专业叫法: Vue实例的数据对象. (data实际上是给整个Vue实例提供数据来源的.)
如果data是对象的话,对象必须是纯粹的对象 (含零个或者多个的 Key /value 对)
data数据是如何插入到模版语句当中的?
{{}}这是Vue框架自己搞得一套语法,别的框架看不懂的浏览器也是不能识别的.
Vue框架自己能够看懂的,这种语法在Vue框架中被称为: 模版语法中的插值语法.(有人把他叫做胡子语法)
怎么用?
插值语法的小细节
{这个位置不能够包含其他字符包括空格{}这个位置不能够包含其他字符包括空格}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 模板语句的数据来源</title > <script src ="../js/vue.js" > </script > </head > <body > <div id ="app" > </div > <script > new Vue({ template : `<h1 > 最近非常火爆的电视剧 {{name }} ,它的上映日期是 {{releaseTime }} 。主角是 {{lead.name }} ,年龄是 {{lead.age }} 岁。 其他演员包括: {{actors [0].name}} ( {{actors [0].age}} 岁), {{actors [1].name}} ( {{actors [1].age}} 岁)。 {{a.b.c.d.e.name }} </h1 > `, data : { name : '狂飙!!!', releaseTime : '2023年1月2日', lead : { name : '高启强', age : 41 }, actors : [ { name : '安欣', age : 41 }, { name : '高启兰', age : 29 } ], a : { b : { c : { d : { e : { name : '呵呵' } } } } } } }).$mount('#app') </script > </body > </html >
03-template配置项详解 关于template配置项:
template 后面指定的是模版语句,但是模版语句中只有一个根节点.
只有data中的数据发生变化,模版语句一定会重新编译. (只要data变,template就会重新编译,重新渲染)
如果使用template配置项额话,指定挂载位置的元素会被替换.
好消息: 目前我们可以不使用template来编写模版语句. 这些模版语句可以直接写到html标签中.Vue框架能够找到并编译,然后渲染.
如果直接将模版语句先写到HTML标签中,指定的挂载位置就不会被替换了.
关于$mount(‘#app’)?
也可以不使用$mount(“#app”)的方式进行挂载了.
在Vue中有一个配置项: el
el配置项和$mount()可以达到同样的效果.
el配置项的作用?
告诉Vue实例去接管哪个容器.
el: ‘#app’,表示让Vue实例去接管id=’app’的容器
el其实是element的缩写.翻译为元素.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > template配置项详解</title > <script src ="../js/vue.js" > </script > </head > <body > <div id ="app" > <div > <h1 > {{msg}}</h1 > <h1 > {{name}}</h1 > </div > </div > <script > new Vue({ // 错误的 //template : '<h1 > {{msg }} </h1 > <h1 > 动力节点老杜</h1 > ', template : ` <div > <h1 > {{msg }} </h1 > <h1 > {{name }} </h1 > </div > `, data : { msg : 'Hello Vue!!!!!!!', name : 'a动力节点老杜!!!!!!' }, el : '#app' //el : document.getElementById('app') }) //}).$mount('#app') </script > </body > </html >
Vue实例和容器是一夫一妻制 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > Vue实例 和 容器 的关系是:一夫一妻制</title > <script src ="../js/vue.js" > </script > </head > <body > <div class ="app" > <h1 > {{msg}}</h1 > </div > <div class ="app" > <h1 > {{msg}}</h1 > </div > <div id ="app2" > <h1 > {{name}}</h1 > </div > <script > new Vue ({ el : '.app' , data : { msg : 'Hello Vue!' } }) new Vue ({ el : '#app2' , data : { name : 'zhangsan' } }) new Vue ({ el : '#app2' , data : { name : 'jackson' } }) </script > </body > </html >
1.2 Vue核心技术 01-模版语法之插值语法 主要研究: 1. 在data中声明的变量、函数等都可以。 2. 常量都可以。 3. 只要是合法的javascript表达式,都可以。 4. 模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 等。 ‘Infinity,undefined,NaN,isFinite,isNaN,’ ‘parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,’ ‘Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,’ ‘require’
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 模板语法之插值语法{{}}</title > <script src ="../js/vue.js" > </script > </head > <body > <div id ="app" > <h1 > {{msg}}</h1 > <h1 > {{sayHello()}}</h1 > <h1 > {{100}}</h1 > <h1 > {{'hello vue!'}}</h1 > <h1 > {{3.14}}</h1 > <h1 > {{1 + 1}}</h1 > <h1 > {{'hello' + 'vue'}}</h1 > <h1 > {{msg + 1}}</h1 > <h1 > {{'msg' + 1}}</h1 > <h1 > {{gender ? '男' : '女'}}</h1 > <h1 > {{number + 1}}</h1 > <h1 > {{'number' + 1}}</h1 > <h1 > {{msg.split('').reverse().join('')}}</h1 > <h1 > {{Date}}</h1 > <h1 > {{Date.now()}}</h1 > <h1 > {{Math}}</h1 > <h1 > {{Math.ceil(3.14)}}</h1 > </div > <script > var i = 100 function sum ( ){ console .log ('sum.....' ); } new Vue ({ el : '#app' , data : { number : 1 , gender : true , msg : 'abcdef' , sayHello : function ( ){ console .log ('hello vue!' ); } } }) </script > </body > </html >
02-模版语法之指令 指令语法:
指令是什么
指令的指着是,当表达式的值改变时,将其产生的连带影响,响应式地作用于 Demo
Vue框架中的所以指令的名字都以”v-“开始.
插值是写在标签体当中的,那么指令写在哪里呢?
Vue框架中所以得指令都是以HTML标签的属性形式存在的,例如:
<span 指令是写在这里的></span>
注意:虽然指令是写在标签的属性位置上,但是这个指令浏览器是无法直接看懂的。
是需要先让Vue框架进行编译的,编译之后的内容浏览器是可以看懂的。
指令的语法规则:
指令的一个完整的语法格式:
<HTML标签 v-指令名:参数=”javascript表达式”></HTML标签>
表达式:
之前在插值语法中,那么指令中的表达式就可以写什么。实际上是一样的。
但是需要注意的是:在指令中的表达式位置不能外层再添加一个{{}}
不是所有的指令都有参数和表达式:
有的指令,不需要参数,也不需要表达式,例如:v-once
有的指令,不需要参数,但是需要表达式,例如:v-if=”表达式”
有的指令,既需要参数,又需要表达式,例如:v-bind:参数=”表达式”
v-once 指令
作用:只渲染元素一次。随后的重新渲染,元素及其所有的子节点将被视为静态内容并跳过。这可以用于优化更新性能。
v-if=”表达式” 指令
作用:表达式的执行结果需要是一个布尔类型的数据:true或者false
true:这个指令所在的标签,会被渲染到浏览器当中。
false:这个指令所在的标签,不会被渲染到浏览器当中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > 模板语法之指令语法 v-??? </title > <script src ="../js/vue.js" > </script > </head > <body > <div id ="app" > <h1 > {{msg}}</h1 > <h1 v-once > {{msg}}</h1 > <h1 v-if ="a > b" > v-if测试:{{msg}}</h1 > </div > <script > new Vue ({ el : '#app' , data : { msg : 'Hello Vue!' , a : 10 , b : 11 } }) </script > </body > </html >
03-v-bind指令详解 v-bind指令详解
这个指令是干啥的? 它可以让HTML标签的某个属性的值产生动态的效果。
v-bind指令的语法格式:
1 <HTML标签 v-bind:参数 ="表达式" > </HTML标签 >
v-bind指令的编译原理? 编译前:
1 <HTML标签 v-bind:参数 ="表达式" > </HTML标签 >
编译后:
1 <HTML标签 参数 ="表达式的执行结果" > </HTML标签 >
注意两项: 第一:在编译的时候v-bind后面的“参数名”会被编译为HTML标签的“属性名” 第二:表达式会关联data,当data发生改变之后,表达式的执行结果就会发生变化。 所以,连带的就会产生动态效果。
v-bind因为很常用,所以Vue框架对该指令提供了一种简写方式: 只是针对v-bind提供了以下简写方式:
什么时候使用插值语法?什么时候使用指令? 凡是标签体当中的内容要想动态,需要使用插值语法。 只要向让HTML标签的属性动态,需要使用指令语法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 <!DOCTYPE html > <html lang ="en" > <head > <meta charset ="UTF-8" > <meta http-equiv ="X-UA-Compatible" content ="IE=edge" > <meta name ="viewport" content ="width=device-width, initial-scale=1.0" > <title > v-bind指令详解(它是一个负责动态绑定的指令)</title > <script src ="../js/vue.js" > </script > </head > <body > <div id ="app" > <span v-bind:xyz ="msg" > </span > <span v-bind:xyz ="'msg'" > </span > <img src ="../img/1.jpg" > <br > <img v-bind:src ="imgPath" > <br > <img :src ="imgPath" > <br > <input type ="text" name ="username" value ="zhangsan" > <br > <input type ="text" name ="username" :value ="username" > <br > <a href ="https://www.baidu.com" > 走起</a > <br > <a :href ="url" > 走起2</a > <br > <h1 > {{msg}}</h1 > </div > <script > new Vue ({ el : '#app' , data : { msg : 'Hello Vue!' , imgPath : '../img/1.jpg' , username : 'jackson' , url : 'https://www.baidu.com' } }) </script > </body > </html >