前端技术栈三(vue+Axios)

打印 上一主题 下一主题

主题 758|帖子 758|积分 2274

一、Vue

1 基本介绍

1.1 Vue 是什么?




  • Vue (读音 /vjuː/,类似于 view) 是一个前端框架, 易于构建用户界面
  • Vue 的核心库只关注视图层,不光易于上手,还便于与第三方库或项目整合
  • 支持和别的类库联合使用
  • 开辟复杂的单页应用非常方便
  • Vue Vue.js 的简称
  • 官网: https://cn.vuejs.org/
  • git 地址: https://github.com/vuejs
1.2 MVVM 



MVVM 头脑 


  • M∶即 Model,模型,包括数据和一些基本操纵
  • V∶即View,视图,页面渲染结果
  • VM∶即 View-Model,模型与视图间的双向操纵(无需开辟人员干涉)
  • MVVM之前,开辟人员从后端获取需要的数据模型,然后要通过 DOM 操纵 Model渲染到View 中。而后当用户操纵视图,我们还需要通过 DOM获取 View 中的数据然后同步到Model 中。
  • MVVM中的VM 要做的事情就是DOM 操纵完全封装起来,开辟人员不用再关心Model View 之间是怎样互相影响的
  • 只要我们 Model 发生了改变,View上自然就会体现出来
  • 当用户修改了ViewModel 中的数据也会跟着改变。。
  • 结果:把开辟人员从繁琐的 DOM操纵中解放出来,把关注点放在怎样操纵 Model, 大提高开辟服从
 2 快速入门

2.1 基本使用 



  • 官网文档:https://cn.vuejs.org/v2/guide/index.html
  • 下载: https://cn.vuejs.org/v2/guide/installation.html

为了让 IDEA 辨认 Vue 代码,需要安装插件 Vue.js 
 关于办理idea应用市场加载不出来得,可自行百度
2.2 案例

2.2.1 需求 


2.2.2 步骤



  • 创建新文件夹 D:\idea_java_projects\vue , 直接拖到 Idea 工具,使用 idea 打开
  • 将下载好的 vue.js 拷贝到 D:\idea_java_projects\vue\vue.js
  • 创建 D:\idea_java_projects\vue\vue_quick_start.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Vue快速入门</title>
  6. </head>
  7. <body>
  8.     <div id="app">
  9.         <!--
  10.         1.{{message}}:插值表达式
  11.         2. message就是从model的data数据池获取
  12.         3.当我们的代码执行时,会到data{}数据池进行匹配数据,如果匹配上就会替换吗,反之就是输出空
  13.         -->
  14.         <h1>欢迎你{{message}}--{{name}}</h1>
  15.     </div>
  16.     <!--引入vue.js-->
  17. <script src="vue.js"></script>
  18. <script>
  19.     //创建vue对象
  20.     /*
  21.         1.创建Vue对象实例
  22.         2.我们在控制台输出vm对象,看看对象的结构
  23.      */
  24.     let vm = new Vue({
  25.         el:"#app",//创建的vue实例挂载到 id=app的div
  26.         data:{//表示数据池,以k-v形式保存,根据自己的需求设置
  27.             message:"Hello-Vue",
  28.             name:"韩顺平教育"
  29.         }
  30.     })
  31.     console.log("vm=>",vm);
  32.     console.log("message",vm._data.message);
  33.     console.log("name=",vm._data.name);
  34.     console.log("message",vm.message);//等价的,他放了一份在data中,也放了一份在vm的根下
  35.     console.log("name=",vm.name);
  36. </script>
  37. </body>
  38. </html>
复制代码
 2.2.3 留意事项和使用细节



  • 留意代码次序,要求 div 在前,script 在后,否则无法绑定命据 【从上到下执行,也就是div得在前】



  • 从案例可以体会声明式渲染:Vue.js 采用简洁的模板语法来声明式地将数据渲染进DOM 的系统, 做到数据和显示分离
  •  Vue 没有繁琐的 DOM 操纵,假如使用 jQuery,我们需要先找到 div 节点,获取到 DOM 对象,然后举行节点操纵, 显然 Vue 更加简洁
 3 数据单向渲染

3.1 基本阐明 


3.2 需求分析/图解 

演示 v-bind 的使用, 可以绑定元素的属性(如图 

把准备好的 1.jpg 拷贝到 D:\idea_java_projects\vue\1.jpg 
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>单向数据渲染</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <h1>{{message}}</h1>
  10.     <!--
  11.     1. 使用插值表达式引用 data 数据池数据是在标签体内
  12.     2. 如果是在标签/元素 的属性上去引用 data 数据池数据时,不能使用插值表达式
  13.     3. 需要使用 v-bind, 因为 v-bind 是 vue 来解析, 默认报红,但是不影响解析
  14.     4. 如果不希望看到报红, 直接 alt+enter 引入 xmlns:v-bind
  15.     -->
  16.     <!--<img src="{{img_src}}">-->
  17.     <img v-bind:src="img_src" v-bind:width="img_width">
  18.     <img :src="img_src" :width="img_width">
  19. </div>
  20. <script src="vue.js"></script>
  21. <script>
  22.     let vm=new Vue({
  23.         el:"#app",
  24.         data:{
  25.             message:"hello 耗子精",
  26.             img_src:"1.jpg",
  27.             img_width:"200px"
  28.         }
  29.     })
  30. </script>
  31. </body>
  32. </html>
复制代码
 3.3 留意事项和使用细节



  • 插值表达式是用在标签体的
  • 假如给标签属性绑定值,则使用 v-bind 指令
 4 数据双向绑定

4.1 需求分析 

需求在输入框中输入信息,会更新到相应绑定的位置 
 4.2 代码实现


  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>双向数据渲染</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <h1>
  10.         {{message}}
  11.     </h1>
  12.     <!--老韩解读
  13.         1. v-bind 是数据单向渲染: data 数据池绑定的数据变化,会影响 view
  14.         2. v-model="hobby.val" 是数据的双向渲染, (1)data 数据池绑定的数据变化,会影响 view 【底层的机制是 Data Bindings】
  15.         (2)view 关联的的元素值变化, 会影响到 data 数据池的数据【底层机制是 Dom
  16.         Listeners】
  17.         -->
  18.     <input type="text" v-model:value="hobby.val"><br/><br/>
  19.     <input type="text" v-bind:value="hobby.val"><br/><br/>
  20.     <p>你输入的爱好是:{{hobby.val}}~</p>
  21. </div>
  22. <script src="vue.js"></script>
  23. <script>
  24.     let vm=new Vue({
  25.         el:"#app",
  26.         data:{
  27.             message:"hi,输入你的爱好",
  28.             hobby:{
  29.                 val:"购物"
  30.             }
  31.         }
  32.     })
  33. </script>
  34. </body>
  35. </html>
复制代码
 5 事件绑定

5.1 基本阐明 



  • 使用 v-on 举行事件处理,好比: v-on:click 表示处理鼠标点击事件
  • 事件调用的方法定义在 vue 对象声明的 methods 节点中
  • v-on:事件名 可以绑定指定事件
  • 官方文档:https://cn.vuejs.org/v2/guide/events.html
5.2 需求 演示 Vue 事件绑定操纵 

 5.3 代码


  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>事件处理</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <h1>{{message}}</h1>
  10.     <!--老韩解读
  11.     1. v-on:click 表示我们要给 button 元素绑定一个 click 的事件
  12.     2. sayHi() 表示绑定的方法, 在方法池 methods{} 定义的
  13.     3. 底层仍然是 dom 处理
  14.     4. 如果方法不需要传递参数,可以省略()
  15.     5. v-on:click 可以简写@, 但是需要浏览器支持
  16.     -->
  17.     <button v-on:click="sayHi()">点击输出</button>
  18.     <button v-on:click="sayOk()">点击输出</button>
  19.     <button v-on:click="sayHi">点击输出</button>
  20.     <button @click="sayOk">点击输出</button>
  21. </div>
  22. <script src="vue.js"></script>
  23. <script>
  24.     let vm=new Vue({
  25.         el:"#app",
  26.         data:{
  27.             message: "Vue 事件处理的案例",
  28.             name: "韩顺平教育"
  29.         },
  30.         // 1. 是一个 methods 属性, 对应的值是对象{}
  31.         // 2. 在{} 中, 可以写很多的方法, 你可以这里理解是一个方法池
  32.         // 3. 这里需要小伙伴有 js 的基础=>java web 第 4 章
  33.         methods:{
  34.             sayHi(){
  35.                 console.log("hi, 银角大王~");
  36.             },
  37.             sayOk(){
  38.                 console.log("ok, 金角大王~");
  39.             }
  40.         }
  41.     })
  42.     console.log(vm)
  43. </script>
  44. </body>
  45. </html>
复制代码
修饰符

6.1 基本阐明 



  • 修饰符 (Modifiers) 是以(.)指明的后缀,指出某个指令以特殊方式绑定。
  • 例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault()即阻止事件本来的默认行为
  • 事件修饰符 【.stop 阻止事件继续流传  .prevent 阻止标签默认行为 .capture 使用事件捕获模式,即元素自身触发的事件先在此到处理,然后才交由内部元素进行处理 .self 只当在 event.target 是当前元素自身时触发处理函数   .once 事件将只会触发一次 .passive告诉浏览器你不想阻止事件的默认行为】
   

  • 键盘事件的修饰符 【好比: 项目常常需要监听一些键盘事件来触发步调的执行,而 Vue 中允许在监听的时间添加关键修饰符 <input v-on:keyup.13="submit">
     

  • v-model 的修饰符 【好比: 主动过滤用户输入的首尾空格 <input v-model.trim="msg">】
     6.2 需求分析/图解

   需求  :   演示   v-on:submit.prevent   的使用  ,   假如没有输入名字,控制台输出   "  请输入名    "  ,否则输出   "  提交表单  "   

   解惑  ,   为什么在开辟中  ,   偶尔需要   ,   让某个指令以特殊方式绑定  ,   好比表单提交     1)   我们不希望将这个表单举行团体提交  ,   而是是   Ajax   的方式举行提交     2)   因为表单团体提交会导致重载页面  ,     Ajax   方式可以有选择性提交数据,而且局部刷    
6.3 代码 

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml" xmlns:v-model="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Vue 修饰符使用</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <!-- 解读
  10.     1. 修饰符用于指出一个指令应该以特殊方式绑定。
  11.     2. v-on:submit.prevent 的.prevent 修饰符表示阻止表单提交的默认行为
  12.     3. 执行 程序员指定的方法
  13.     -->
  14.     <form action="https://www.baidu.com" v-on:submit.prevent="onMysubmit">
  15.         妖怪名:<input type="text" v-model:value="monster.name"><br/><br/>
  16.         <button type="submit">注册</button>
  17.     </form>
  18. </div>
  19. <script src="vue.js"></script>
  20. <script>
  21.     let vm=new Vue({
  22.         el: '#app',
  23.         data:{
  24.            //数据池
  25.            monster:{//monster 数据(对象)的属性, 可以动态生成
  26.            }
  27.         },
  28.         methods:{
  29.             onMysubmit(){
  30.                 //console.log("我们自己的表单提交处理...");
  31.                 //"", null, undefined 都是 false
  32.                 if(this.monster.name){
  33.                     console.log("提交表单 name=",this.monster.name);
  34.                     //这里,程序员就可以根据自己的业务发出 ajax 请求到后端
  35.                     //得到数据后,在进行数据更新
  36.                 }else {
  37.                     console.log("请输入名字")
  38.                 }
  39.             }
  40.         }
  41.     })
  42. </script>
  43. </body>
  44. </html>
复制代码
 7 条件渲染/控制: v-if v-show

7.1 基本阐明

Vue 提供了 v-if v-show 条件指令完成条件渲染/控制
v-if 介绍

v-show 介绍
 官方文档:https://cn.vuejs.org/v2/guide/conditional.html
7.2 应用实例 


  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>条件渲染 v-if</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <!--这里小伙伴还可以看到 checkbox 的 checked 属性的值-->
  10.     <input type="checkbox" v-model="sel">是否同意条款[v-if 实现]
  11.     <!-- 老师解读 v-if/v-else 会根据 返回的值,来决定是否动态创建对应的子组件 <h1>
  12.     -->
  13.     <h1 v-if="sel">你同意条款</h1>
  14.     <h1 v-else>你不同意条款</h1>
  15. </div>
  16. <script src="vue.js"></script>
  17. <script>
  18.     //为了调试方便, 使用 vm 接收 Vue 实例
  19.     let vm = new Vue({
  20.         el: '#app',
  21.         data: {//data 数据池
  22.             sel: false
  23.         }
  24.     })
  25. </script>
  26. </body>
  27. </html>
复制代码
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>条件渲染 v-show</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <!--这里小伙伴还可以看到 checkbox 的 checked 属性的值-->
  10.     <input type="checkbox" v-model="sel">是否同意条款[v-show 实现]
  11.     <!-- 老师解读 v-if/v-else 会根据 返回的值,来决定是否动态创建对应的子组件 <h1>
  12.     -->
  13.     <h1 v-show="sel">你同意条款</h1>
  14.     <h1 v-show="!sel">你不同意条款</h1>
  15. </div>
  16. <script src="vue.js"></script>
  17. <script>
  18.     //为了调试方便, 使用 vm 接收 Vue 实例
  19.     let vm = new Vue({
  20.         el: '#app',
  21.         data: {//data 数据池
  22.             sel: false
  23.         }
  24.     })
  25. </script>
  26. </body>
  27. </html>
复制代码
7.3 v-if VS v-show

v-if 会确保在切换过程中,条件块内的事件监听器和子组件销毁和重建
 v-show 机制相对简朴, 不管初始条件是什么,元素总是会被渲染,而且只是对 CSS 举行切换
 使用建议:假如要频仍地切换,建议使用 v-show ;假如运行时条件很少改变,使用 v-if 较好
列表渲染: v-for 

8.1 基本阐明 



  • Vue 提供了 v-for 列表循环指令
  • 官方文档:https://cn.vuejs.org/v2/guide/list.html
对数组举行遍历 
 v-for 来遍历一个对象的 property
 

8.2 应用实例 


  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>v-for 列表渲染</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <!-- 基本语法:
  10.     <li v-for="变量 in 数字">{{ 变量 }}</li>-->
  11.     <h1>简单的列表渲染</h1>
  12.     <ul>
  13.         <li v-for="i in 3">{{i}}</li>
  14.     </ul>
  15. <!--    <li v-for="(变量, 索引) in 值">{{ 变量 }} - {{ 索引 }}</li>-->
  16.     <h1>简单的列表渲染-带索引</h1>
  17.     <ul>
  18.         <li v-for="(i,index) in 3">{{i}}-{{index}}</li>
  19.     </ul>
  20.     <h1>遍历数据列表</h1>
  21.     <!-- 语法:
  22.     <tr v-for="对象 in 对象数组">
  23.     <td>{{对象的属性}}</td>
  24.     </tr>
  25.     -->
  26.     <table width="400px" border="1px">
  27.         <tr v-for="monster in monsters">
  28.             <td>{{monster.id}}</td>
  29.             <td>{{monster.name}}</td>
  30.             <td>{{monster.age}}</td>
  31.         </tr>
  32.     </table>
  33. </div>
  34. <script src="vue.js">
  35. </script>
  36. <script>
  37.     let vm=new Vue({
  38.         el:"#app",
  39.         data:{
  40.             monsters: [
  41.                 {id: 1, name: '牛魔王', age: 800},
  42.                 {id: 2, name: '黑山老妖', age: 900},
  43.                 {id: 3, name: '红孩儿', age: 200}
  44.             ]
  45.         }
  46.     })
  47. </script>
  48. </body>
  49. </html>
复制代码
组件化编程

9.1 基本阐明 



  • 在大型应用开辟的时间,页面可以分别成许多部分,往往差别的页面,也会有雷同的部 分。例如可能会有雷同的头部导航。
  • 但是假如每个页面都独自开辟,这无疑增长了我们开辟的本钱。以是我们会把页面的不同部分拆分成独立的组件,然后在差别页面就可以共享这些组件,克制重复开辟(如图)
 



  • 组件(Component) Vue.js 最强盛的功能之一(可以提高复用性[1.界面2.业务处理])
  • 组件也是一个Vue实例,也包括∶ datamethods、生命周期函数等
  • 组件渲染需要 html模板,以是增长了template 属性,值就是 HTML 模板
  • 对于全局组件,任何vue 实例都可以直接在 HTML 中通过组件名称来使用组件
  • data 是一个函数,不再是一个对象, 如许每次引用组件都是独立的对象/数据
 9.2 应用实例

问题分析
点击次数会共享  假如要办理, 需要我们定义差别的点击次数变量(好比 countcount2count3 )来记录差别  也就是复用性差
实现方式 1-普通方式 

  1. <!DOCTYPE html>
  2. <html lang="en" xmlns:v-on="http://www.w3.org/1999/xhtml">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>组件化编程</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <!--非组件化方式-普通方式-->
  10.     <button v-on:click="click1()">点击次数= {{count}} 次【非组件化方式】</button><br/><br/>
  11.     <!--需求是,有多个按钮,都要进行点击统计
  12.     老师解读
  13.     1. 其实三个按钮界面其实一样, 但是目前我们都重新写了一次, 复用性低
  14.     2. 点击各个按钮的业务都是对次数+1, 因此业务处理类似,但是也都重新写了一个方法, 复
  15.     用性低
  16.     3. 解决===> 组件化编程
  17.     -->
  18.     <button v-on:click="click2()">点击次数= {{count2}} 次【非组件化方式】</button><br/><br/>
  19.     <button v-on:click="click3()">点击次数= {{count3}} 次【非组件化方式】</button><br/>
  20.     </div>
  21. <script src="vue.js"></script>
  22. <script>
  23.     new Vue({
  24.         el: "#app",
  25.         data: {//data 数据池
  26.             count: 10,
  27.             count2: 10,
  28.             count3: 10
  29.         },
  30.         methods: {//methods 属性, 可以定义相应的方法
  31.             click1() {
  32.                 this.count+=1;
  33.             },
  34.             click2() {
  35.                 this.count2+=1;
  36.             },
  37.             click3() {
  38.                 this.count3+=1;
  39.             }
  40.         }
  41.     })
  42. </script>
  43. </body>
  44. </html>
复制代码
 实现方式 2-全局组件方式

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>组件化编程-全局组件</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <h1>组件化编程-全局组件</h1>
  10.     <counter></counter>
  11.     <counter></counter>
  12. </div>
  13. <script src="vue.js"></script>
  14. <script>
  15.     //1、定义一个全局组件, 名称为 counter
  16.     //2. {} 表示就是我们的组件相关的内容
  17.     //3. template 指定该组件的界面, 因为会引用到数据池的数据,所以需要是模板字符串
  18.     //4. 这里老师说明: 要把组件视为一个 Vue 实例,也有自己的数据池和 methods
  19.     //5. 这里老师说明: 对于组件,我们的数据池的数据,是使用函数/方法返回[目的是为了保证每个组件的数据是独立], 不能使用原来的方式
  20.     //6. 这时我们达到目前,界面通过 template 实现共享,业务处理也复用
  21.     //7. 全局组件是属于所有 vue 实例,因此,可以在所有的 vue 实例使用
  22.     Vue.component("counter",{
  23.         template:`<button v-on:click="click()">点击次数={{count}}次【全局组件】</button>`,
  24.         data(){//这里需要注意,和原来的方式不一样!!!!
  25.             return {
  26.                 count:10
  27.             }
  28.         },
  29.         methods:{
  30.             click(){
  31.                 this.count++;
  32.             }
  33.         }
  34.     })
  35.     //创建Vue实例,必须要有
  36.     new Vue({
  37.         el:"#app",//Vue的实例挂载点
  38.     })
  39. </script>
  40. </body>
  41. </html>
复制代码
 实现方式 3-局部组件方式

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>组件化编程-局部组件</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <!--使用局部组件 ,该组件是从挂载到 app 的 vue 中的-->
  10.     <h1>组件化编程-局部组件</h1>
  11.     <my_counter></my_counter>
  12. </div>
  13. <script src="vue.js"></script>
  14. <script>
  15.     //1、定义一个局部组件, 名称为 buttonCounter
  16.     //1. 可以把常用的组件,定义在某个 commons.js 中 export
  17.     //2. 如果某个页面需要使用, 直接 import
  18.     const buttonCounter={
  19.         template:`<button v-on:click="click()">点击次数={{count}}次【局部组件】</button>`,
  20.         data(){//这里需要注意,和原来的方式不一样!!!!
  21.             return {
  22.                 count:10
  23.             }
  24.         },
  25.         methods:{
  26.             click(){
  27.                 this.count++;
  28.             }
  29.         }
  30.     }
  31.     //创建Vue实例,必须要有
  32.     new Vue({
  33.         el:"#app",//Vue的实例挂载点
  34.         components: {
  35.             //引入/注册某个组件, 此时 my_counter 就是一个组件, 是一个局部组件,他的使用范围在当前 vue
  36.             'my_counter':buttonCounter
  37.         }
  38.     })
  39. </script>
  40. </body>
  41. </html>
复制代码
 9.3 组件化小结

假如方法体, 只有简朴的语句,好比 count++, 那么可以举行简写

组件定义需要放置在 new Vue() 前,否则组件注册会失败 
   组件也是一个   Vue   实例,因此它的定义是也存在∶   data    methods  、生命周期函数等     data   是一个函数,不再是一个对象, 如许每次引用组件都是独立的对象  /  数据     组件渲染需要   html   模板,以是增长了   template   属性,值就是   HTML   模板    10 生命周期和监听函数(钩子函数)

10.1 基本阐明



  • Vue 实例有一个完备的生命周期,也就是说从开始创建、初始化数据、编译模板、挂载DOM、渲染-更新-渲染、卸载等一系列过程,我们称为 Vue 实例的生命周期
  • 钩子函数(监听函数): Vue 实例在完备的生命周期过程中(好比设置数据监听、编译模板、将实例挂载到 DOM 、在数据变化时更新 DOM ), 也会运行叫做生命周期钩子的函
  • 钩子函数的 作用就是在某个阶段, 给步调员一个做某些处理的机会
 10.2 生命周期示意图


   1) new Vue()             new 了一个   Vue   的实例对象,此时就会进入组件的创建过程。     2) Init Events & Lifecycle             初始化组件的事件和生命周期函数     3)   beforeCreate             组件创建之后遇到的第一个生命周期函数,这个阶段 data     methods   以及   dom   结构都未     被初始化,也就是获取不到   data   的值,不能调用   methods   中的函数     4) Init injections & reactivity             这个阶段中,   正在初始化   data     methods   中的方法     5)   created             - 这个阶段组件的   data     methods   中的方法已初始化竣事,可以访问,但是   dom   结构未     初始化,页面未渲染             -   阐明  :在这个阶段,常常会发起   Ajax   哀求     6)   编译模板结构  (  在内存  )     7)   beforeMount               当模板在内存中编译完成,此时内存中的模板结构还未渲染至页面上,看不到真实的数据        8) Create vm.$el and replace ‘el’ with it                这一步,再在把内存中渲染好的模板结构替换至真实的 dom    结构也就是页面上        9)    mounted                此时,页面渲染好,用户看到的是真实的页面数据, 生命周期创建阶段完毕,进入到了运        行中的阶段        10)    生命周期运行中                10.1    beforeUpdate         当执行此函数,数据池的数据新的,但是页面是旧的                10.2 Virtual DOM re-render and patch         根据最新的 data 数据,重新渲染内存中的模板结构,并把渲染好的模板结构,替换至页面                  10.3    updated        页面已经完成了更新,此时,   data    数据和页面的数据都是新的        11) beforeDestroy                当执行此函数时,组件即将被销毁,但是还没有真正开始销毁,此时组件的 data      methods           数据或方法 还可被调用           12) Teardown……                   注销组件和事件监听           13) destroyed                   组件已经完成了销毁        10.3 应用实例

10.3.1 需求分析

   需求  :   展示   VUE   实例生命周期和 钩子函数  /  监听函数  /  生命周期函数 执行时机     1)   重 点 研 究 几 个 重 要 的 钩 子 函 数   (beforeCreate, created, beforeMount, mounted,     beforeUpdate, updated)     2)   在这几个钩子函数中  ,   数据模型是否加载  /  使用  ?   自定义方法是否加载  /  可用  ? html       板是否加载  /  使用  ? html   模板是否完成渲染  ?   

 10.3.2 代码实现

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>Vue生命周期和钩子函数</title>
  6. </head>
  7. <body>
  8. <!--这里可以视为用户看到的页面-对应前面讲解的页面 dom-->
  9. <div id="app">
  10.     <span id="num">{{num}}</span>
  11.     <button @click="num++">赞!</button>
  12.     <h2>{{name}},有{{num}}次点赞</h2>
  13. </div>
  14. <script src="vue.js"></script>
  15. <script>
  16.     let vm=new Vue({
  17.         el:"#app",
  18.         data:{
  19.             //数据池
  20.             name:"kristina",
  21.             num:0
  22.         },
  23.         methods:{
  24.             show(){
  25.                 return this.name;
  26.             },
  27.             add(){
  28.                 this.num++;
  29.             }
  30.         },
  31.         beforeCreate(){
  32.             //生命周期函数-创建Vue实例前
  33.             console.log("=============beforeCreate==========");
  34.             console.log("数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[no]",this.name," ",this.num);//undefined   undefined
  35.             //console.log("自定义方法是否加载/使用?[no]", this.show());
  36.             console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));//;yes
  37.             console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[no]", document.getElementById("num").innerText);
  38.         },
  39.         created(){
  40.             //生命周期函数-创建Vue实例前
  41.             console.log("=============created==========");
  42.             console.log("数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",this.name," ",this.num);
  43.             console.log("自定义方法是否加载/使用?[yes]", this.show());
  44.             console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));//;yes
  45.             console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[no]", document.getElementById("num").innerText);
  46.             //可以发出 Ajax
  47.             //接收返回的数据
  48.             //再次去更新 data 数据池的数据
  49.             //编译内存模板结构
  50.             //.....
  51.         },
  52.         beforeMount() {//生命周期函数-挂载前
  53.             console.log("=============beforeMount==========");
  54.             console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
  55.                 this.name, " ", this.num);
  56.             console.log("自定义方法是否加载/使用?[yes]", this.show());
  57.             console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
  58.             console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[no]", document.getElementById("num").innerText);
  59.         },
  60.         mounted() {//生命周期函数-挂载后
  61.             console.log("=============mounted==========");
  62.             console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
  63.                 this.name, " ", this.num);
  64.             console.log("自定义方法是否加载/使用?[yes]", this.show());
  65.             console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
  66.             console.log(" 用 户 页 面 dom 是 否 被 渲 染 ?[yes]", document.getElementById("num").innerText);
  67.         },
  68.         beforeUpdate() {//生命周期函数-数据池数据更新前
  69.             console.log("=============beforeUpdate==========");
  70.             console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
  71.                 this.name, " ", this.num);
  72.             console.log("自定义方法是否加载/使用?[yes]", this.show());
  73.             console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
  74.             console.log(" 用 户 页 面 dom 数 据 是 否 被 更 新 ?[no]", document.getElementById("num").innerText);
  75.             //验证数据==>修正
  76.             // if(this.num < 10 ) {
  77.             // this.num = 8;
  78.             // }
  79.         },
  80.         updated() {//生命周期函数-数据池数据更新后
  81.             console.log("=============updated==========");
  82.             console.log(" 数 据 模 型 / 数 据 池 的 数 据 是 否 加 载 / 使 用 ?[yes]",
  83.             this.name, " ", this.num);
  84.             console.log("自定义方法是否加载/使用?[yes]", this.show());
  85.             console.log(" 用 户 页 面 dom 是 否 加 载 / 使 用 ?[yes]", document.getElementById("num"));
  86.             console.log(" 用 户 页 面 dom 数 据 是 否 被 更 新 ?[yes]", document.getElementById("num").innerText);
  87.         }
  88.     })
  89. </script>
  90. </body>
  91. </html>
复制代码
 11 Vue2 脚手架模块化开辟

11.1 安装

npm 报错办理
npm -v报错-CSDN博客
   1.   搭建   Vue   脚手架工程,需要使用到   NPM(node package manager), npm   是随   nodejs   安装     的一款包管理工具  ,   类似   Maven  。以是我们需要先安装   Nodejs     2.   为了  更好兼容   ,这里我们安装   node.js10.16.3  , 要求也使用这个版本  (  因为这里     只是演示   Vue   脚手架工程  ),  后面还会讲解   Vue3   的脚手架工程搭建  ,   再对   Node   升级  .     3.   假如以前安装过   node.js ,   为防止版本辩论,先卸载之  ,   假如你没安装   nodejs,   就不用管  
 下载 node.js10.16.3 地址: https://nodejs.org/en/blog/release/v10.16.3/
 安装 node.js10.16.3 , 直接下一步即可, 安装到 d:\program\nodejs10.16【自定义】

6. 验证是否安装成功, 假如看到不到, 退出 cmd, 重新开一个窗口测试即可 

7 先删除以前的 cli 版本<不论是之前未下载或没有下载>
npm uninstall vue-cli -g
8 安装淘宝镜像-cnpm
 
安装 webpack webpack-cli , 指令: npm install webpack@4.41.2 webpack-cli -D
 9 安装 cnpm install -g @vue/cli@4.0.3

10 确认 Vue-Cli 版本 

11.创建目次vue_project,cmd到该目次 
   12.  使用  webpack  创建  vue  脚手架项目  (  提醒  :假如出现了  downloadingtemplate....,    60s退出窗口,  重新来操纵一次即可  .)【基本坑全遇见了,呜呜·】  
 

 
12 浏览器:http://localhost:8080

11.2 运行项目 

   1.     Vue   脚手架项目,直接拖到   IDEA  ,就可以打开    2.   配置   NPM   
  3. 效果
 11.3 Vue 项目结构分析



Vue 哀求页面执行流程
 11.4 应用实例-Vue 项目引入 ElementUI



Vue2 项目中, 使用 ElementUI 组件, 如图

   ElementUI   官网  : https://element.eleme.cn/#/zh-CN      安装 element-ui 组件库, cmd 下进入到项目,指令 npm i element-ui@2.12.0

 主要的代码是components里面的组件内容,和router里面的路由
  1. <template>
  2. <!--    模板表示页面视图html-->
  3.   <div>
  4.     <h1>{{msg}}</h1>
  5.     <!-- element-ui 组件 -->
  6.     <el-row>
  7.       <el-button>默认按钮</el-button>
  8.       <el-button type="primary">主要按钮</el-button>
  9.       <el-button type="success">成功按钮</el-button>
  10.       <el-button type="info">信息按钮</el-button>
  11.       <el-button type="warning">警告按钮</el-button>
  12.       <el-button type="danger">危险按钮</el-button>
  13.     </el-row>
  14.     <table  >
  15.       <tr>
  16.         <td colspan="3">第1行第1列</td>
  17.       </tr>
  18.       <tr>
  19.         <td rowspan="2">第2行第1列</td>
  20.         <td>第2行第2列</td>
  21.         <td>第2行第3列</td>
  22.       </tr>
  23.       <tr>
  24.         <td>第3行第2列</td>
  25.         <td>第3行第3列</td>
  26.       </tr>
  27.       <tr>
  28.         <td rowspan="2">第4行第1列</td>
  29.         <td>第4行第2列</td>
  30.         <td>第4行第3列</td>
  31.       </tr>
  32.       <tr>
  33.         <td>红烧肉<img src="@/assets/2.png" width="100"></td>
  34.         <td>第5行第3列</td>
  35.       </tr>
  36.     </table>
  37.   </div>
  38. </template>
  39. <!--定义数据操作方法,默认导出-->
  40. <script>
  41.     export default {
  42.         name: "Hsp",
  43.         data(){
  44.           return {
  45.             msg: "Welcome to Vue"
  46.           }
  47.       }
  48.     }
  49. </script>
  50. <!-- 样式-->
  51. <style scoped>
  52.   div{
  53.     width: 900px;
  54.     background-color: aliceblue;
  55.     margin: 0 auto;
  56.   }
  57.   h1{
  58.     color: red;
  59.   }
  60.   table,tr,td {
  61.     border: 1px solid red;
  62.     margin: 0 auto;
  63.     width: 600px;
  64.     border-collapse: collapse;
  65.     height: 50px;
  66.   }
  67. </style>
复制代码
router/index.js
  1. import Vue from 'vue'
  2. import Router from 'vue-router'
  3. import HelloWorld from '@/components/HelloWorld'
  4. import hello from '@/components/hello'
  5. import Hsp from '@/components/Hsp'
  6. Vue.use(Router)
  7. export default new Router({
  8.   routes: [//路由表
  9.     {
  10.       path: '/',
  11.       name: 'HelloWorld',
  12.       component: HelloWorld
  13.     },
  14.     {
  15.       path: '/hello',
  16.       name: 'hello',
  17.       component: hello
  18.     },
  19.     {
  20.       path: '/Hsp',
  21.       name: 'Hsp',
  22.       component: Hsp
  23.     }
  24.   ]
  25. })
复制代码
二、Axios

1.基本阐明




  • axios 是独立于 vue 的一个项目,不是 Vue 的一部分
  • axios 通常和 Vue 一起使用,实现 Ajax 操纵
  • Axios 是一个基于 promise HTTP
  • https://javasoho.com/axios/

Axios 库文件
使用 axios 需要引入 axios 库文件
可以直接引入
 也可以下载 axios.min.js ,在本地引入

Axios 应用实例 

   需求  :     Vue   项目中使用   Axios,   从服务器获取   json   数据  ,   显示在页面   

 代码实现
创建 D:\hspedu_前端技术栈_temp\axios\response.data.json 
     JSON   对象转成   JSON.stringify(response)  
 
记得导包哦,
data.json
  1. { "success": true,
  2.   "message": "成功",
  3.   "data":
  4.   { "items": [
  5.       { "name": "牛魔王", "age": 800
  6.       },
  7.         { "name": "红孩儿", "age": 500
  8.       },
  9.         { "name": "蜈蚣精", "age": 200
  10.   }
  11. ]
  12. }
  13. }
复制代码
 axios_quick_start.html
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.     <meta charset="UTF-8">
  5.     <title>axios的应用实例</title>
  6. </head>
  7. <body>
  8. <div id="app">
  9.     <h1>{{msg}}</h1>
  10.     <table border="1px" width="200px">
  11.         <tr>
  12.             <td>名字</td>
  13.             <td>年龄</td>
  14.         </tr>
  15.         <tr v-for="monster in monsterList">
  16.             <td>{{monster.name}}</td>
  17.             <td>{{monster.age}}</td>
  18.         </tr>
  19.     </table>
  20. </div>
  21. <script src="axios.min.js"></script>
  22. <script src="vue.js"></script>
  23. <script>
  24.     new Vue({
  25.         el:"#app",
  26.         data:{
  27.             monsterList:[],//表示妖怪的信息数组
  28.             msg:"妖怪信息表格"
  29.         },
  30.         methods:{
  31.             //定义方法
  32.             list(){//发送ajax请求,获取数据axios
  33.                 /** 解读
  34.                  * 1. 使用 axios 发送 ajax 请求
  35.                  * 2. 语 法 格 式 axios. 请 求 方 式 ( 请 求 路 径 ).then( 箭 头 函
  36.                  数).catch(箭头函数)
  37.                  * 3. 请求成功,执行 then 的函数, response 就是返回的数据, 名
  38.                  字有程序员确定
  39.                  * 4. 请求失败, 执行 catch 的函数
  40.                  * 5. this.monsterList = response.data.data.items 把 返 回 的
  41.                  data.items 赋给 monsterList
  42.                  * 6. 这里的 http://127.0.0.1:63342/axios/response.data.json 路
  43.                  径需要根据实际的端口和资源名来修改
  44.                  */
  45.                 axios.get("http://localhost:63342/axios/response/data.json")
  46.                     .then((responseData)=>{
  47.                         console.log("responseData=",responseData);
  48.                         console.log("responseData.data.data.items=",responseData.data.data.items);
  49.                         this.monsterList=responseData.data.data.items;
  50.                     }).catch(err=>{
  51.                         console.log(err);
  52.                 })
  53.             }
  54.         },
  55.         created(){
  56.             this.list();
  57.         }
  58.     })
  59. </script>
  60. </body>
  61. </html>
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表