Vue实战

1. Vue 引言

渐进式 JavaScript 框架 —摘自官网

  1. # 渐进式
  2. 1. 易用 html css javascript
  3. 2. 高效 开发前端页面 非常高效
  4. 3. 灵活 开发灵活 多样性
  5. # 总结
  6. Vue 是一个javascript 框架
  7. # 后端服务端开发人员:
  8. Vue 渐进式javascript框架: 让我们通过操作很少的DOM,甚至不需要操作页面中任何DOM元素,就很容易的完成数据和视图绑定 双向绑定 MVVM
  9. 注意: 日后在使用Vue过程中页面中不要在引入Jquery框架
  10. htmlcss--->javascript ----->jquery---->angularjs -----> Vue
  11. # Vue 作者
  12. 尤雨溪 国内的

2. Vue入门

2.1 下载Vuejs

  1. //开发版本:
  2. <!-- 开发环境版本,包含了有帮助的命令行警告 -->
  3. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  4. //生产版本:
  5. <!-- 生产环境版本,优化了尺寸和速度 -->
  6. <script src="https://cdn.jsdelivr.net/npm/vue"></script>

2.2 Vue第一个入门应用

  1. <div id="app">
  2. {{ msg }} {{username}} {{pwd}}
  3. <br>
  4. <span>
  5. {{ username }}
  6. <h1>{{ msg }}</h1>
  7. </span>
  8. </div>
  9. <!--引入vue.js-->
  10. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  11. <script>
  12. const app = new Vue({
  13. el:"#app", //element 用来给Vue实例定义一个作用范围
  14. data:{ //用来给Vue实例定义一些相关数据
  15. msg:"百知欢迎你,期待你的加入!",
  16. username:"hello Vue!",
  17. pwd :"12345",
  18. },
  19. });
  20. </script>
  1. # 总结:
  2. 1.vue实例(对象)中el属性: 代表Vue的作用范围 日后在Vue的作用范围内都可以使用Vue的语法
  3. 2.vue实例(对象)中data属性: 用来给Vue实例绑定一些相关数据, 绑定的数据可以通过{{变量名}}在Vue作用范围内取出
  4. 3.在使用{{}}进行获取data中数据时,可以在{{}}中书写表达式,运算符,调用相关方法,以及逻辑运算等
  5. 4.el属性中可以书写任意的CSS选择器[jquery选择器],但是在使用Vue开发是推荐使用 id选择器

3. v-text和v-html

3.1 v-text

v-text:用来获取data中数据将数据以文本的形式渲染到指定标签内部 类似于javascript 中 innerText

  1. <div id="app" class="aa">
  2. <span >{{ message }}</span>
  3. <span v-text="message"></span>
  4. </div>
  5. <!--引入vue.js-->
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <script>
  8. const app = new Vue({
  9. el:"#app",
  10. data:{
  11. message:"百知欢迎您"
  12. }
  13. })
  14. </script>
  1. # 总结
  2. 1.{{}}(插值表达式)和v-text获取数据的区别在于
  3. a.使用v-text取值会将标签中原有的数据覆盖 使用插值表达式的形式不会覆盖标签原有的数据
  4. b.使用v-text可以避免在网络环境较差的情况下出现插值闪烁

3.2 v-html

v-html:用来获取data中数据将数据中含有的html标签先解析在渲染到指定标签的内部 类似于javascript中 innerHTML

  1. <div id="app" class="aa">
  2. <span>{{message}}</span>
  3. <br>
  4. <span v-text="message"></span>
  5. <br>
  6. <span v-html="message">xxxxxx</span>
  7. </div>
  8. <!--引入vue.js-->
  9. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  10. <script>
  11. const app = new Vue({
  12. el:"#app",
  13. data:{
  14. message:"<a href=''>百知欢迎您</a>"
  15. }
  16. })
  17. </script>

4.vue中事件绑定(v-on)

4.1 绑定事件基本语法

  1. <!-- DOM:评论点赞的dom -->
  2. <div id="app4">
  3. <span>{{msg}}</span>
  4. <button v-on:click="zan_add()">赞:{{zan}}</button>
  5. </div>
  6. <!-- Vue声明:数据定义和方法定义 -->
  7. <script>
  8. const app4 = new Vue({
  9. el:"#app4",
  10. data:{
  11. msg:"这是一部好电影.",
  12. zan:100
  13. },
  14. methods:{
  15. zan_add:function(){
  16. console.log("点了赞");
  17. this.zan++;//修改vue的data的之,会自动修改dom中绑定的之,是联动的。
  18. }
  19. }
  20. });
  21. </script>
  1. # 总结:
  2. 事件 事件源:发生事件dom元素 事件: 发生特定的动作 click.... 监听器 发生特定动作之后的事件处理程序 通常是js中函数
  3. 1.vue中绑定事件是通过v-on指令来完成的 v-on:事件名 v-on:click
  4. 2.v-on:事件名的赋值语句中是当前时间触发调用的函数名
  5. 3.vue中事件的函数统一定义在Vue实例的methods属性中
  6. 4.vue定义的事件中this指的就是当前的Vue实例,日后可以在事件中通过使用this获取Vue实例中相关数据

4.2 Vue中事件的简化语法

  1. <!-- DOM:评论点赞的dom -->
  2. <div id="app5">
  3. <span>{{msg}}</span>
  4. <button @click="zan_add()">赞:{{zan}}</button>
  5. </div>
  6. <!-- Vue声明:数据定义和方法定义 -->
  7. <script>
  8. const app4 = new Vue({
  9. el:"#app5",
  10. data:{
  11. msg:"这是一部好电影.",
  12. zan:100,
  13. isZan:false,
  14. },
  15. methods:{
  16. zan_add:function(){
  17. console.log("点了赞");
  18. if(this.isZan){
  19. this.zan--;//修改vue的data的之,会自动修改dom中绑定的之,是联动的。
  20. this.isZan = false;
  21. }else{
  22. this.zan++;//修改vue的data的之,会自动修改dom中绑定的之,是联动的。
  23. this.isZan = true;
  24. }
  25. }
  26. }
  27. });
  28. </script>
  1. # 总结:
  2. 1.日后在vue中绑定事件时可以通过@符号形式 简化 v-on 的事件绑定

4.3 Vue事件函数两种写法

  1. <div id="app">
  2. <span>{{count}}</span>
  3. <input type="button" value="改变count的值" @click="changecount">
  4. </div>
  5. <!--引入vue.js-->
  6. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  7. <script>
  8. const app = new Vue({
  9. el:"#app",
  10. data:{
  11. count:1,
  12. },
  13. methods:{
  14. /*changecount:function(){
  15. this.count++;
  16. }*/
  17. changecount(){
  18. this.count++;
  19. }
  20. }
  21. });
  22. </script>
  1. # 总结:
  2. 1.Vue中事件定义存在两种写法 一种是 函数名:function(){} 推荐 一种是 函数名(){} 推荐

4.4 Vue事件参数传递

  1. <div id="app6">
  2. <span>{{count}}</span>
  3. <input type="button" value="改变count为指定的值" @click="changecount(23,'xiaohei')">
  4. </div>
  5. <script>
  6. const app = new Vue({
  7. el:"#app6",
  8. data:{
  9. count:1,
  10. },
  11. methods:{
  12. //定义changecount
  13. changecount(count,name){
  14. this.count = count;
  15. alert(name);
  16. }
  17. }
  18. });
  19. </script>
  1. # 总结:
  2. 1.在使用事件时,可以直接在事件调用出给事件进行参数传递,在事件定义出通过定义对应变量接收传递的参数

5.v-show v-if v-bind

5.1 v-show

v-show:用来控制页面中某个标签元素是否展示 底层使用控制是 display 属性

  1. <!-- DOM -->
  2. <div id="app7">
  3. <button @click="removeBtn">删除</button>
  4. <h2 v-show="removeMsg">删除成功!</h2>
  5. </div>
  6. <!-- Vue声明:数据默认值 + 事件函数 -->
  7. <script>
  8. const app7 = new Vue({
  9. el:"#app7",
  10. data:{
  11. removeMsg:false,
  12. },
  13. methods:{
  14. //定义时间
  15. removeBtn:function(){
  16. this.removeMsg = true;
  17. setTimeout(function(){
  18. app7.removeMsg = false;
  19. },3000)
  20. }
  21. }
  22. })
  23. </script>
  1. # 总结
  2. 1.在使用v-show时可以直接书写boolean值控制元素展示,也可以通过变量控制标签展示和隐藏
  3. 2.v-show中可以通过boolean表达式控制标签的展示课隐藏

5.2 v-if

v-if: 用来控制页面元素是否展示 底层控制是DOM元素的增加和删除

  1. <!-- DOM -->
  2. <div id="app7">
  3. <button @click="removeBtn">删除</button>
  4. <h2 v-if="removeMsg">删除成功!</h2>
  5. </div>
  6. <!-- Vue声明:数据默认值 + 事件函数 -->
  7. <script>
  8. const app7 = new Vue({
  9. el:"#app7",
  10. data:{
  11. removeMsg:false,
  12. },
  13. methods:{
  14. //定义时间
  15. removeBtn:function(){
  16. this.removeMsg = true;
  17. setTimeout(function(){
  18. app7.removeMsg = false;
  19. },3000)
  20. }
  21. }
  22. })
  23. </script>

5.3 v-bind

v-bind: 用来绑定标签的属性从而通过vue动态修改标签的属性

  1. <div id="app">
  2. <img width="300" v-bind:title="msg" v-bind:class="{aa:showCss}" src="baizhilogo.jpg" alt="">
  3. </div>
  4. <!--引入vue.js-->
  5. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  6. <script>
  7. const app = new Vue({
  8. el:"#app",
  9. data:{
  10. msg:"百知教育官方logo!!!!",
  11. showCss:true,
  12. },
  13. methods:{
  14. }
  15. })
  16. </script>

5.4 v-bind 简化写法

  1. vue为了方便我们日后绑定标签的属性提供了对属性绑定的简化写法如 `v-bind:属性名` 简化之后 `:属性名`
  1. <div id="app">
  2. <img width="300" :title="msg" :class="{aa:showCss}" :src="src" alt="">
  3. <input type="button" value="动态控制加入样式" @click="addCss">
  4. <input type="button" value="改变图片" @click="changeSrc">
  5. </div>
  6. <!--引入vue.js-->
  7. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  8. <script>
  9. const app = new Vue({
  10. el:"#app",
  11. data:{
  12. msg:"百知教育官方logo!!!!",
  13. showCss:true,
  14. src:"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1583490365568&di=52a82bd614cd4030f97ada9441bb2d0e&imgtype=0&src=http%3A%2F%2Fimg.kanzhun.com%2Fimages%2Flogo%2F20160714%2F820a68f65b4e4a3634085055779c000c.jpg"
  15. },
  16. methods:{
  17. addCss(){
  18. this.showCss= !this.showCss;
  19. },
  20. changeSrc(){
  21. this.src = "https://ss2.bdstatic.com/70cFvnSh_Q1YnxGkpoWK1HF6hhy/it/u=1925088662,1336364220&fm=26&gp=0.jpg";
  22. }
  23. }
  24. })
  25. </script>

6 v-for的使用

v-for: 作用就是用来对对象进行遍历的(数组也是对象的一种)

  1. <div id="app">
  2. <span>{{ user.name }} {{ user.age }}</span>
  3. <br>
  4. <!--
  5. 通过v-for遍历对象
  6. -->
  7. <span v-for="(value,key,index) in user">
  8. {{index}} : {{key}} : {{value}}
  9. </span>
  10. <!--
  11. 通过v-for遍历数组
  12. -->
  13. <ul>
  14. <li v-for="a,index in arr" >
  15. {{index}} {{a}}
  16. </li>
  17. </ul>
  18. <!--
  19. 通过v-for遍历数组中对象
  20. :key 便于vue内部做重用和排序
  21. -->
  22. <ul>
  23. <li v-for="user,index in users" :key="user.id">
  24. {{index+1}} {{ user.name }} === {{ user.age }} ==== {{ user.content }}
  25. </li>
  26. </ul>
  27. </div>
  28. <!--引入vue-->
  29. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  30. <script>
  31. const app = new Vue({
  32. el: "#app",
  33. data: {
  34. user:{name:"小陈",age:23},
  35. arr:["北京校区", "天津校区", "河南校区"],
  36. users:[
  37. {id:"1",name:"xiaochen",age:23,content:"我曾经也是一个单纯的少年!"},
  38. {id:"2",name:"小白",age:23,content:"我曾经是一个邪恶的少年!"},
  39. ]
  40. },
  41. methods: {}
  42. });
  43. </script>
  1. # 总结
  2. 1.在使用v-for的时候一定要注意加入:key 用来给vue内部提供重用和排序的唯一key

7 v-model 双向绑定

v-model: 作用用来绑定标签元素的值与vue实例对象中data数据保持一致,从而实现双向的数据绑定机制

  1. <div id="app">
  2. <input type="text" v-model="message">
  3. <span>{{message}}</span>
  4. <hr>
  5. <input type="button" value="改变Data中值" @click="changeValue">
  6. </div>
  7. <!--引入vue-->
  8. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  9. <script>
  10. const app = new Vue({
  11. el: "#app",
  12. data: {
  13. message:""
  14. },
  15. methods: {
  16. changeValue(){
  17. this.message='百知教育!';
  18. }
  19. }
  20. });
  21. </script>
  1. # 总结
  2. 1.使用v-model指令可以实现数据的双向绑定
  3. 2.所谓双向绑定 表单中数据变化导致vue实例data数据变化 vue实例中data数据的变化导致表单中数据变化 称之为双向绑定
  4. # MVVM架构 双向绑定机制
  5. Model: 数据 Vue实例中绑定数据
  6. VM: ViewModel 监听器
  7. View: 页面 页面展示的数据

8 事件修饰符

修饰符: 作用用来和事件连用,用来决定事件触发条件或者是阻止事件的触发机制

  1. # 1.常用的事件修饰符
  2. .stop
  3. .prevent
  4. .capture
  5. .self
  6. .once
  7. .passive

8.1 stop事件修饰符

用来阻止事件冒泡

  1. <div id="app">
  2. <div class="aa" @click="divClick">
  3. <!--用来阻止事件冒泡-->
  4. <input type="button" value="按钮" @click.stop="btnClick">
  5. </div>
  6. </div>
  7. <!--引入vue-->
  8. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  9. <script>
  10. const app = new Vue({
  11. el: "#app",
  12. data: {},
  13. methods: {
  14. btnClick(){
  15. alert('button被点击了');
  16. },
  17. divClick(){
  18. alert('div被点击了');
  19. }
  20. }
  21. });
  22. </script>

8.2 prevent 事件修饰符

用来阻止标签的默认行为

  1. <!--用来阻止事件的默认行为-->
  2. <a href="http://www.baizhibest.com/" @click.prevent="aClick">百知教育</a>

8.3 self 事件修饰符

用来针对于当前标签的事件触发 ===========> 只触发自己标签的上特定动作的事件 只关心自己标签上触发的事件 不监听事件冒泡

  1. <!--只触发标签自身的事件-->
  2. <div class="aa" @click.self="divClick">
  3. <!--用来阻止事件冒泡-->
  4. <input type="button" value="按钮" @click.stop="btnClick">
  5. <input type="button" value="按钮1" @click="btnClick1">
  6. </div>

8.4 once 事件修饰符

once 一次 作用: 就是让指定事件只触发一次

  1. <!--
  2. .prevent : 用来阻止事件的默认行为
  3. .once : 用来只执行一次特定的事件
  4. -->
  5. <a href="http://www.baizhibest.com/" @click.prevent.once="aClick">百知教育</a>

9. 按键修饰符

作用: 用来与键盘中按键事件绑定在一起,用来修饰特定的按键事件的修饰符

  1. # 按键修饰符
  2. .enter
  3. .tab
  4. .delete (捕获“删除”和“退格”键)
  5. .esc
  6. .space
  7. .up
  8. .down
  9. .left
  10. .right

9.1 enter 回车键

用来在触发回车按键之后触发的事件

  1. <input type="text" v-model="msg" @keyup.enter="keyups">

9.2 tab 键

用来捕获到tab键执行到当前标签是才会触发

  1. <input type="text" @keyup.tab="keytabs">

10. Axios 基本使用

10.1 引言

Axios 是一个异步请求技术,核心作用就是用来在页面中发送异步请求,并获取对应数据在页面中渲染 页面局部更新技术 Ajax

10.2 Axios 第一个程序

中文网站:https://www.kancloud.cn/yunye/axios/234845

安装: https://unpkg.com/axios/dist/axios.min.js

10.2.1 GET方式的请求

  1. //发送GET方式请求
  2. axios.get("http://localhost:8989/user/findAll?name=xiaochen").then(function(response){
  3. console.log(response.data);
  4. }).catch(function(err){
  5. console.log(err);
  6. });

10.2.2 POST方式请求

  1. //发送POST方式请求
  2. axios.post("http://localhost:8989/user/save",{
  3. username:"xiaochen",
  4. age:23,
  5. email:"xiaochen@zparkhr.com",
  6. phone:13260426185
  7. }).then(function(response){
  8. console.log(response.data);
  9. }).catch(function(err){
  10. console.log(err);
  11. });

10.2.3 axios并发请求

并发请求: 将多个请求在同一时刻发送到后端服务接口,最后在集中处理每个请求的响应结果

  1. //1.创建一个查询所有请求
  2. function findAll(){
  3. return axios.get("http://localhost:8989/user/findAll?name=xiaochen");
  4. }
  5. //2.创建一个保存的请求
  6. function save(){
  7. return axios.post("http://localhost:8989/user/save",{
  8. username:"xiaochen",
  9. age:23,
  10. email:"xiaochen@zparkhr.com",
  11. phone:13260426185
  12. });
  13. }
  14. //3.并发执行
  15. axios.all([findAll(),save()]).then(
  16. axios.spread(function(res1,res2){ //用来将一组函数的响应结果汇总处理
  17. console.log(res1.data);
  18. console.log(res2.data);
  19. })
  20. );//用来发送一组并发请求

11. Vue 生命周期

生命周期钩子 ====> 生命周期函数

lifecycle.png

  1. # Vue生命周期总结
  2. 1.初始化阶段
  3. beforeCreate(){ //1.生命周期中第一个函数,该函数在执行时Vue实例仅仅完成了自身事件的绑定和生命周期函数的初始化工作,Vue实例中还没有 Data el methods相关属性
  4. console.log("beforeCreate: "+this.msg);
  5. },
  6. created(){ //2.生命周期中第二个函数,该函数在执行时Vue实例已经初始化了data属性和methods中相关方法
  7. console.log("created: "+this.msg);
  8. },
  9. beforeMount(){//3.生命周期中第三个函数,该函数在执行时Vue将El中指定作用范围作为模板编译
  10. console.log("beforeMount: "+document.getElementById("sp").innerText);
  11. },
  12. mounted(){//4.生命周期中第四个函数,该函数在执行过程中,已经将数据渲染到界面中并且已经更新页面
  13. console.log("Mounted: "+document.getElementById("sp").innerText);
  14. }
  15. 2.运行阶段
  16. beforeUpdate(){//5.生命周期中第五个函数,该函数是data中数据发生变化时执行 这个事件执行时仅仅是Vue实例中data数据变化页面显示的依然是原始数据
  17. console.log("beforeUpdate:"+this.msg);
  18. console.log("beforeUpdate:"+document.getElementById("sp").innerText);
  19. },
  20. updated(){ //6.生命周期中第六个函数,该函数执行时data中数据发生变化,页面中数据也发生了变化 页面中数据已经和data中数据一致
  21. console.log("updated:"+this.msg);
  22. console.log("updated:"+document.getElementById("sp").innerText);
  23. },
  24. 3.销毁阶段
  25. beforeDestory(){//7.生命周期第七个函数,该函数执行时,Vue中所有数据 methods componet 都没销毁
  26. },
  27. destoryed(){ //8.生命周期的第八个函数,该函数执行时,Vue实例彻底销毁
  28. }

12. Vue中组件(Component)

12.1 组件作用

组件作用: 用来减少Vue实例对象中代码量,日后在使用Vue开发过程中,可以根据 不能业务功能将页面中划分不同的多个组件,然后由多个组件去完成整个页面的布局,便于日后使用Vue进行开发时页面管理,方便开发人员维护。

12.2 组件使用

12.2.1 全局组件注册

说明:全局组件注册给Vue实例,日后可以在任意Vue实例的范围内使用该组件

  1. //1.开发全局组件
  2. Vue.component('login',{
  3. template:'<div><h1>用户登录</h1></div>'
  4. });
  1. //2. 使用组件必须要在Vue实例范围内使用。
  2. <body>
  3. <div id="app">
  4. <login></login>
  5. </div>
  6. </body>
  7. <script type="text/javascript">
  8. new Vue({
  9. el:'#app'
  10. })
  11. </script>
  1. # 注意:
  2. 1.Vue.component用来开发全局组件 参数1: 组件的名称 参数2: 组件配置{} template:''用来书写组件的html代码 template中必须有且只有一个root元素
  3. 2.使用时需要在Vue的作用范围内根据组件名使用全局组件
  4. 3.如果在注册组件过程中使用 驼峰命名组件的方式 在使用组件时 必须将驼峰的所有单词小写加入-线进行使用

12.2.2 局部组件注册

说明:通过将组件注册给对应Vue实例中一个components属性来完成组件注册,这种方式不会对Vue实例造成累加

  • 第一种开发方式
  1. //局部组件登录模板声明
  2. let login ={ //具体局部组件名称
  3. template:'<div><h2>用户登录</h2></div>'
  4. };
  5. const app = new Vue({
  6. el: "#app",
  7. data: {},
  8. methods: {},
  9. components:{ //用来注册局部组件
  10. login:login //注册局部组件
  11. }
  12. });
  13. //局部组件使用 在Vue实例范围内
  14. <login></login>
  • 第二种开发方式 ```javascript //1.声明局部组件模板 template 标签 注意:在Vue实例作用范围外声明

//2.定义变量用来保存模板配置对象 let login ={ //具体局部组件名称 template:’#loginTemplate’ //使用自定义template标签选择器即可 };

//3.注册组件
const app = new Vue({ el: “#app”, data: {}, methods: {}, components:{ //用来注册局部组件 login:login //注册局部组件 } });

//4.局部组件使用 在Vue实例范围内

  1. <a name="b99eb71c"></a>
  2. ### 12.3 Prop的使用
  3. `作用:props用来给组件传递相应静态数据或者是动态数据的`
  4. <a name="354290f4"></a>
  5. #### 12.3.1 通过在组件上声明静态数据传递给组件内部
  6. ```javascript
  7. //1.声明组件模板配置对象
  8. let login = {
  9. template:"<div><h1>欢迎:{{ userName }} 年龄:{{ age }}</h1></div>",
  10. props:['userName','age'] //props作用 用来接收使用组件时通过组件标签传递的数据
  11. }
  12. //2.注册组件
  13. const app = new Vue({
  14. el: "#app",
  15. data: {},
  16. methods: {},
  17. components:{
  18. login //组件注册
  19. }
  20. });
  21. //3.通过组件完成数据传递
  22. <login user-name="小陈" age="23"></login>
  1. # 总结:
  2. 1.使用组件时可以在组件上定义多个属性以及对应数据
  3. 2.在组件内部可以使用props数组生命多个定义在组件上的属性名 日后可以在组件中通过{{ 属性名 }} 方式获取组件中属性值

12.3.2 通过在组件上声明动态数据传递给组件内部

  1. //1.声明组件模板对象
  2. const login = {
  3. template:'<div><h2>欢迎: {{ name }} 年龄:{{ age }}</h2></div>',
  4. props:['name','age']
  5. }
  6. //2.注册局部组件
  7. const app = new Vue({
  8. el: "#app",
  9. data: {
  10. username:"小陈陈",
  11. age:23
  12. },
  13. methods: {},
  14. components:{
  15. login //注册组件
  16. }
  17. });
  18. //3.使用组件
  19. <login :name="username" :age="age"></login> //使用v-bind形式将数据绑定Vue实例中data属性,日后data属性发生变化,组件内部数据跟着变化

12.3.3 prop的单向数据流

单向数据流:所有的 prop 都使得其父子 prop 之间形成了一个**单向下行绑定**:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。

所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。 额外的,每次父级组件发生更新时,子组件中所有的 prop 都将会刷新为最新的值。这意味着你应该在一个子组件内部改变 prop。如果你这样做了,Vue 会在浏览器的控制台中发出警告。—-摘自官网

12.4 组件中定义数据和事件使用

1. 组件中定义属于组件的数据
  1. //组件声明的配置对象
  2. const login = {
  3. template:'<div><h1>{{ msg }} 百知教育</h1><ul><li v-for="item,index in lists">{{ index }}{{ item }}</li></ul></div>',
  4. data(){ //使用data函数方式定义组件的数据 在templatehtml代码中通过插值表达式直接获取
  5. return {
  6. msg:"hello",
  7. lists:['java','spring','springboot']
  8. }//组件自己内部数据
  9. }
  10. }

2.组件中事件定义
  1. const login={
  2. template:'<div><input type="button" value="点我触发组件中事件" @click="change"></div>',
  3. data(){
  4. return {
  5. name:'小陈'
  6. };
  7. },
  8. methods:{
  9. change(){
  10. alert(this.name)
  11. alert('触发事件');
  12. }
  13. }
  14. }
  1. # 总结
  2. 1.组件中定义事件和直接在Vue中定义事件基本一致 直接在组件内部对应的html代码上加入@事件名=函数名方式即可
  3. 2.在组件内部使用methods属性用来定义对应的事件函数即可,事件函数中this 指向的是当前组件的实例

12.5 向子组件中传递事件并在子组件中调用改事件

在子组件中调用传递过来的相关事件必须使用 this.$emit('函数名') 方式调用

  1. //1.声明组件
  2. const login = {
  3. template:"<div><h1>百知教育 {{ uname }}</h1> <input type='button' value='点我' @click='change'></div>",
  4. data(){
  5. return {
  6. uname:this.name
  7. }
  8. },
  9. props:['name'],
  10. methods:{
  11. change(){
  12. //调用vue实例中函数
  13. this.$emit('aaa'); //调用组件传递过来的其他函数时需要使用 this.$emit('函数名调用')
  14. }
  15. }
  16. }
  17. //2.注册组件
  18. const app = new Vue({
  19. el: "#app",
  20. data: {
  21. username:"小陈"
  22. },
  23. methods: {
  24. findAll(){ //一个事件函数 将这个函数传递给子组件
  25. alert('Vue 实例中定义函数');
  26. }
  27. },
  28. components:{
  29. login,//组件的注册
  30. }
  31. });
  32. //3.使用组件
  33. <login @find="findAll"></login> //=====> 在组件内部使用 this.$emit('find')

13.Vue中路由(VueRouter)

13.1 路由

路由:根据请求的路径按照一定的路由规则进行请求的转发从而帮助我们实现统一请求的管理

13.2 作用

用来在vue中实现组件之间的动态切换

13.3 使用路由

  1. 引入路由

    1. <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    2. <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> //vue 路由js
  2. 创建组件对象 ```javascript //声明组件模板 const login = { template:’

    登录

    ‘ };

const register = { template:’

注册

‘ };

  1. 3. 定义路由对象的规则
  2. ```javascript
  3. //创建路由对象
  4. const router = new VueRouter({
  5. routes:[
  6. {path:'/login',component:login}, //path: 路由的路径 component:路径对应的组件
  7. {path:'/register',component:register}
  8. ]
  9. });
  1. 将路由对象注册到vue实例

    1. const app = new Vue({
    2. el: "#app",
    3. data: {
    4. username:"小陈",
    5. },
    6. methods: {},
    7. router:router //设置路由对象
    8. });
  2. 在页面中显示路由的组件

    1. <!--显示路由的组件-->
    2. <router-view></router-view>
  3. 根据连接切换路由

    1. <a href="#/login">点我登录</a>
    2. <a href="#/register">点我注册</a>

    注意:router的跳转链接使用#开头

13.4 router-link使用

作用:用来替换我们在切换路由时使用a标签切换路由

好处:就是可以自动给路由路径加入#不需要手动加入

  1. <router-link to="/login" tag="button">我要登录</router-link>
  2. <router-link to="/register" tag="button">点我注册</router-link>
  1. # 总结:
  2. 1.router-link 用来替换使用a标签实现路由切换 好处是不需要书写#号直接书写路由路径
  3. 2.router-link to属性用来书写路由路径 tag属性:用来将router-link渲染成指定的标签

13.5 默认路由

作用:用来在第一次进入界面是显示一个默认的组件

  1. const router = new VueRouter({
  2. routes:[
  3. //{ path:'/',component:login},
  4. { path:'/',redirect:'/login'}, //redirect: 用来当访问的是默认路由 "/" 时 跳转到指定的路由展示 推荐使用
  5. { path:'/login', component:login},
  6. { path:'/register', component:register},
  7. ]
  8. });

13.6 路由中参数传递

  • 第一种方式传递参数 传统方式
  1. 通过?号形式拼接参数

    1. <router-link to="/login?id=21&name=zhangsan">我要登录</router-link>
  2. 组件中获取参数

    1. const login = {
    2. template:'<h1>用户登录</h1>',
    3. data(){return {}},
    4. methods:{},
    5. created(){
    6. console.log("=============>"+this.$route.query.id+"======>"+this.$route.query.name);
    7. }
    8. };
  • 第二种方式传递参数 restful
  1. 通过使用路径方式传递参数

    1. <router-link to="/register/24/张三">我要注册</router-link>
    2. var router = new VueRouter({
    3. routes:[
    4. {path:'/register/:id/:name',component:register} //定义路径中获取对应参数
    5. ]
    6. });
  2. 组件中获取参数

    1. const register = {
    2. template:'<h1>用户注册{{ $route.params.name }}</h1>',
    3. created(){
    4. console.log("注册组件中id: "+this.$route.params.id+this.$route.params.name);
    5. }
    6. };

13.7 嵌套路由

  1. 声明最外层和内层路由 ```javascript

//声明组件模板 const product={ template:’#product’ };

const add = { template:’

商品添加

‘ };

const edit = { template:’

商品编辑

‘ };

  1. 2. 创建路由对象含有嵌套路由
  2. ```javascript
  3. const router = new VueRouter({
  4. routes:[
  5. {
  6. path:'/product',
  7. component:product,
  8. children:[
  9. {path:'add',component: add},
  10. {path:'edit',component: edit},
  11. ]
  12. },
  13. ]
  14. });
  1. 注册路由对象

    1. const app = new Vue({
    2. el: "#app",
    3. data: {},
    4. methods: {},
    5. router,//定义路由对象
    6. });
  2. 测试路由

    1. <router-link to="/product">商品管理</router-link>
    2. <router-view></router-view>

14. Vue CLI 脚手架

14.1 什么是CLI

命令行界面(英语:command-line interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。也有人称之为字符用户界面(CUI)

14.2 什么是Vue CLI

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统。使用Vue 脚手架之后我们开发的页面将是一个完整系统(项目)。

14.3 Vue CLI优势

  • 通过 vue-cli 搭建交互式的项目脚手架。bootstrap css js jquery js 通过执行命令方式下载相关依赖
  • 通过 @vue/cli + @vue/cli-service-global 快速开始零配置原型开发 vue页面 vuejs vuerouter axios(一条命令)
  • 一个运行时依赖 (@vue/cli-service),该依赖:
    • 可升级; 一条命令
    • 基于 webpack 构建,并带有合理的默认配置; webpack 项目打包方式 编译好的项目源码===>部署到服务器上直接使用
    • 可以通过项目内的配置文件进行配置; 默认配置文件,通过修改默认配置文件达到自己想要的项目环境
    • 可以通过插件进行扩展。 vue v-charts elementui
  • 一个丰富的官方插件集合,集成了前端生态中最好的工具。Nodejs(tomcat) Vue VueRouter webpack yarn
  • 一套完全图形化的创建和管理 Vue.js 项目的用户界面

14.4 Vue CLI安装

1. 环境准备
  1. # 1.下载nodejs
  2. http://nodejs.cn/download/
  3. windows系统: .msi 安装包(exe)指定安装位置 .zip(压缩包)直接解压缩指定目录
  4. mac os 系统: .pkg 安装包格式自动配置环境变量 .tar.gz(压缩包)解压缩安装到指定名
  5. # 2.配置nodejs环境变量
  6. windows系统:
  7. 1.计算上右键属性----> 高级属性 ---->环境变量 添加如下配置:
  8. NODE_HOME= nodejs安装目录
  9. PATH = xxxx;%NODE_HOME%;D:\work\node-v10\node_modules\npm\bin
  10. 2.macos 系统
  11. 推荐使用.pkg安装直接配置node环境
  12. # 3.验证nodejs环境是否成功
  13. node -v
  14. # 4.npm介绍
  15. node package mangager nodejs包管理工具 前端主流技术 npm 进行统一管理
  16. maven 管理java后端依赖 远程仓库(中心仓库) 阿里云镜像
  17. npm 管理前端系统依赖 远程仓库(中心仓库) 配置淘宝镜像
  18. # 5.配置淘宝镜像
  19. npm config set registry https://registry.npm.taobao.org
  20. npm config get registry
  21. # 6.配置npm下载依赖位置
  22. windows:
  23. npm config set cache "D:\work\node-v14.9.0-win-x64\repos\cache"
  24. npm config set prefix "D:\work\node-v14.9.0-win-x64\repos\global"
  25. mac os:
  26. npm config set cache "/Users/chenyannan/dev/nodereps"
  27. npm config set prefix "/Users/chenyannan/dev/nodereps"
  28. # 7.验证nodejs环境配置
  29. npm config ls
  30. ; userconfig /Users/chenyannan/.npmrc
  31. cache = "/Users/chenyannan/dev/nodereps"
  32. prefix = "/Users/chenyannan/dev/nodereps"
  33. registry = "https://registry.npm.taobao.org/"

2.安装脚手架
  1. # 0.卸载脚手架
  2. npm uninstall -g @vue/cli //卸载3.x版本脚手架
  3. npm uninstall -g vue-cli //卸载2.x版本脚手架
  4. # 1.Vue Cli官方网站
  5. https://cli.vuejs.org/zh/guide/
  6. # 2.安装vue Cli
  7. npm install -g vue-cli
  8. # 3. 配置vue的path环境变量
  9. PATH=D:\work\node-v14.9.0-win-x64\repos\global

3.第一个vue脚手架项目
  1. # 1.创建vue脚手架第一个项目
  2. 方法1
  3. vue init webpack 项目名
  4. 注意:如果出现异常:vue : 无法加载文件 D:\work\node-v14.9.0-win-x64\repos\global\vue.ps1,因为在此系统上禁止运行脚本
  5. 删除node下的global中的vue.sp1文件后即可。
  6. 方法2
  7. 使用HBuilderX
  8. 设置HBuilder的插件中的nodenpm路径
  9. 新建项目,选择vue-cli
  10. # 2.创建第一个项目
  11. hello ------------->项目名
  12. -build ------------->用来使用webpack打包使用build依赖
  13. -config ------------->用来做整个项目配置目录
  14. -node_modules ------>用来管理项目中使用依赖
  15. -src ------>用来书写vue的源代码[重点]
  16. +assets ------>用来存放静态资源 [重点]
  17. components ------>用来书写Vue组件 [重点]
  18. router ------>用来配置项目中路由[重点]
  19. App.vue ------>项目中根组件[重点]
  20. main.js ------>项目中主入口[重点]
  21. -static ------>其它静态
  22. -.babelrc ------> es6语法转为es5运行
  23. -.editorconfig ------> 项目编辑配置
  24. -.gitignore ------> git版本控制忽略文件
  25. -.postcssrc.js ------> 源码相关js
  26. -index.html ------> 项目主页
  27. -package.json ------> 类似与pom.xml 依赖管理 jquery 不建议手动修改
  28. -package-lock.json ----> package.json加锁
  29. -README.md ----> 项目说明文件
  30. # 3.如何运行在项目的根目录中执行
  31. npm start
  32. # 4.如何访问项目
  33. http://localhost:8081
  34. # 5.Vue Cli中项目开发方式
  35. 注意: 一切皆组件 一个组件中 js代码 html代码 css样式
  36. 1. VueCli开发方式是在项目中开发一个一个组件对应一个业务功能模块,日后可以将多个组件组合到一起形成一个前端系统
  37. 2. 日后在使用vue Cli进行开发时不再书写html,编写的是一个个组件(组件后缀.vue结尾的文件),日后打包时vue cli会将组件编译成运行的html文件

4.如何开发Vue脚手架

注意:在Vue cli 中一切皆组件


15.在脚手架中使用axios

15.1 安装axios

  1. # 1.安装axios
  2. npm install axios --save-dev
  3. # 2.配置main.js中引入axios
  4. import axios from 'axios';
  5. Vue.prototype.$http=axios;
  6. # 3.使用axios
  7. 在需要发送异步请求的位置:this.$http.get("url").then((res)=>{})
  8. this.$http.post("url").then((res)=>{})
  1. axios({
  2. url: 'http://rap2api.taobao.org/app/mock/121145/post',
  3. method: 'get',
  4. params: {
  5. name: '小月'
  6. }
  7. }).then(res => {
  8. console.log('请求结果:', res);
  9. });
  10. axios({
  11. url: 'http://rap2api.taobao.org/app/mock/121145/post',
  12. method: 'post',
  13. data: {
  14. name: '小月'
  15. }
  16. }).then(res => {
  17. console.log('请求结果:', res);
  18. });

16.Vue Cli脚手架项目打包和部署

  1. # 1.在项目根目录中执行如下命令:
  2. vue run build
  3. 注意:vue脚手架打包的项目必须在服务器上运行不能直接双击运行
  4. tomcatNginx都可以。
  5. # 2.打包之后当前项目中变化
  6. 在打包之后项目中出现dist目录,dist目录就是vue脚手架项目生产目录或者说是直接部署目录
  7. # 3. 将dist目录整个拷贝部署:
  8. dist整个拷贝到tomcatwebapps目录下。
  9. dist整个拷贝到springbootstatic目录下
  10. 访问:http://web/dist/index.html 页面。
  11. dist拷贝到任何可以存放静态资源的位置都可以。
  12. # 4. 访问后空白页面的问题处理
  13. index.html中的所有路径改成URI,添加"/项目名/dist"