• Vue基础


    前言

    概述:Vue是一款前端渐进式框架,可以提高前端开发效率。

    特点

    ​ Vue通过MVVM模式,能够实现视图与模型的双向绑定。

    ​ 简单来说,就是数据变化的时候, 页面会自动刷新, 页面变化的时候,数据也会自动变化.

    一、 Vue导入

    概述:Vue是一个类似于Jquery的一个JS框架,所以,如果想使用Vue,则在当前页面导入Vue.js文件即可。

    语法

    <!-- 在线导入 -->
    <!-- 开发环境版本,包含了用帮助的命令行警告 -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <!-- 生产环境版本,优化了尺寸和速度 -->
    <script src="https://cdn.jsdelivr.net/npm/vue"></script>

    <!-- 本地导入 -->
    <script src="node_modules/vue/dist/vue.js"></script>

    案例

    1. <div id="app">
    2. <h1>用户名:<input type="text" v-model="name"/></h1> <br/>
    3. <h1>您输入的用户名是: {{name}}</h1>
    4. </div>
    5. <script type="text/javascript">
    6. //创建一个Vue对象
    7. var app = new Vue({
    8. //指定,该对象代表<div id="app">,也就是说,这个div中的所有内容,都被当前的app对象管理
    9. el: "#app",
    10. //定义vue中的数据
    11. data: {
    12. name: ""
    13. }
    14. });
    15. </script>

    二、Vue基本语法

    1.钩子函数

    **概述:**钩子函数, 其实就是Vue提前定义好的事件, 其作用类似于Servlet的init方法和distory方法

    语法

    <script type="text/javascript">
        var app = new Vue({
            el:"#app",
            //钩子函数created,该方法在页面显示之后,自动执行
            created() {
                console.log("created...");
            }
        });
    </script>

    补充:Vue生命周期和钩子函数

    (1)什么是vue生命周期?

    Vue 实例从创建到销毁的过程,就是生命周期。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程,我们称这是 Vue 的生命周期。

    (2)vue生命周期的作用是什么?

    Vue生命周期中有多个事件钩子,让我们在控制整个Vue实例过程时更容易形成好的逻辑。

    (3)vue生命周期总共有几个阶段?

    可以总共分为8个阶段:创建前/后, 载入前/后,更新前/后,销毁前/后。

    (4)第一次页面加载会触发哪几个钩子?

    第一次页面加载时会触发 beforeCreate, created, beforeMount, mounted 这几个钩子

    (5)DOM 渲染在 哪个周期中就已经完成?

    DOM 渲染在 mounted 中就已经完成了。

    (6)简单描述每个周期具体适合哪些场景?

    生命周期钩子的一些使用方法:

    beforecreate : 可以在此阶段加loading事件,在加载实例时触发;

    created : 初始化完成时的事件写在这里,如在这结束loading事件,异步请求也适宜在这里调用;

    mounted : 挂载元素,获取到DOM节点;

    updated : 如果对数据统一处理,在这里写上相应函数;

    beforeDestroy : 可以做一个确认停止事件的确认框;

    nextTick : 更新数据后立即操作dom;

    2. 插值表达式

    **概述:**插值表达式用户把vue中所定义的数据,显示在页面上. 插值表达式允许用户输入"JS代码片段"

    语法{{ 变量名/对象.属性名 }}

    案例

    1. <html lang="en">
    2. <head>
    3. <meta charset="UTF-8">
    4. <title>vue插值表达式</title>
    5. <script src="node_modules/vue/dist/vue.js"></script>
    6. </head>
    7. <body>
    8. <div id="app">
    9. <h1>欢迎来到-->{{ name }}</h1>
    10. </div>
    11. <script type="text/javascript">
    12. //创建vue对象
    13. var app = new Vue({
    14. //让vue接管div标签
    15. el:"#app",
    16. //定义数据,里边包含一个属性name,值为"白大锅"
    17. data:{
    18. name:"白大锅"
    19. }
    20. });
    21. </script>
    22. </body>
    23. </html>

    3.显示数据(v-text和v-html)
    概述:

    ​ v-text和v-html专门用来展示数据, 其作用和插值表达式类似。v-text和v-html可以避免插值闪烁问题.

    ​ 当网速比较慢时, 使用{{}}来展示数据, 有可能会产生插值闪烁问题。

    ​ 插值闪烁: 在数据未加载完成时,页面会显示出原始的{{}}, 过一会才会展示正常数据.

    语法:

    v-text:<span v-text="msg"></span>    <!-- 相当于<span>{{msg}}</span> -->
    v-html:<span v-html="msg"></span>    <!-- 相当于<span>{{msg}}</span> -->

    区别

    v-text:把数据当作纯文本显示.
    v-html:遇到html标签,会正常解析

    4.数据双向绑定数据(v-model)

    概述:

    ​ Vue的双向绑定可以实现: 数据变化的时候, 页面会自动刷新, 页面变化的时候,数据也会自动变化.

    注意:

    1. 双向绑定, 只能绑定**“文本框,单选按钮,复选框,文本域,下拉列表”**等
    2. 文本框/单选按钮/textarea, 绑定的数据是字符串类型
    3. 单个复选框, 绑定的是boolean类型
    4. 多个复选框, 绑定的是数组
    5. select单选对应字符串,多选对应也是数组

    4.1.绑定文本框

    代码:

    1. <div id="app">
    2. 用户名: <input type="text" v-model="username"/>
    3. </div>
    4. <script type="text/javascript">
    5. var app = new Vue({
    6. el:"#app",
    7. data:{
    8. //该属性值和文本框的value属性值,保持一致
    9. username:""
    10. }
    11. });
    12. </script>

    效果:

    4.2.绑定单个复选框

    代码:

    1. <div id="app">
    2. <input type="checkbox" v-model="agree">同意<br>
    3. </div>
    4. <script type="text/javascript">
    5. var app = new Vue({
    6. el:"#app",
    7. data:{
    8. agree:true
    9. }
    10. });
    11. </script>

    效果:

     

    4.3.绑定多个复选框

    代码:

    1. <div id="app">
    2. <input type="checkbox" value="Java" v-model="language">Java<br>
    3. <input type="checkbox" value="Python" v-model="language">Python<br>
    4. <input type="checkbox" value="Swift" v-model="language">Swift<br>
    5. </div>
    6. <script type="text/javascript">
    7. var app = new Vue({
    8. el:"#app",
    9. data:{
    10. //数组中的值,就是被选中的元素的value属性值
    11. language:["Java","Python"]
    12. }
    13. });
    14. </script>

    效果:

    4.4.form表单数据提交

    例子:传json格式跟formData格式的两种情况

    1. <template>
    2. <div class="from_box">
    3. <form action="">
    4. <input type="text" placeholder="请输入昵称" v-model="formMess.account">
    5. <input type="password" placeholder="请输入密码" v-model="formMess.act_pwd">
    6. <input type="text" placeholder="请输入手机号" v-model="formMess.phone">
    7. </form>
    8. <span class="but" @click="onSubmit()">提交</span>
    9. </div>
    10. </template>
    11. <script>
    12. import axios from 'axios';
    13. export default {
    14. name: "from",
    15. data() {
    16. return {
    17. formMess:{
    18. "account":"",
    19. "act_pwd":"",
    20. "phone":""
    21. }
    22. };
    23. },
    24. methods: {
    25. onSubmit() {
    26. /* json格式提交: */
    27. // let formData = JSON.stringify(this.formMess);
    28. /* formData格式提交: */
    29. let formData = new FormData();
    30. for(var key in this.formMess){
    31. formData.append(key,this.formMess[key]);
    32. }
    33. axios({
    34. method:"post",
    35. url:"xxxxxxx",
    36. headers: {
    37. "Content-Type": "multipart/form-data"
    38. },
    39. withCredentials:true,
    40. data:formData
    41. }).then((res)=>{
    42. console.log(res);
    43. });
    44. }
    45. }
    46. };
    47. </script>
    48. <!-- Add "scoped" attribute to limit CSS to this component only -->
    49. <style scoped lang="less">
    50. .from_box{
    51. form{
    52. width:90%;
    53. margin: auto;
    54. border:.01rem solid gray;
    55. display: flex;
    56. flex-wrap: wrap;
    57. input{
    58. width:80%;
    59. height:.5rem;
    60. margin-bottom: .2rem;
    61. border:.01rem solid black;
    62. height:.5rem;
    63. }
    64. }
    65. .but{
    66. font-size: .14rem;
    67. margin-left:5%;
    68. }
    69. }
    70. </style>

    5.事件处理(v-on)

    5.1.事件绑定(v-on)

    概述:

    ​ Vue中也可以给页面元素绑定事件.

    语法

    <!--完整写法-->
    <button v-on:事件名="函数名/vue表达式">点我</button>
    <!--简化写法-->
    <button @事件名="函数名/vue表达式">点我</button>

    注意:

    ​ Vue支持html中所有已知事件. 如: @click, @submit等, 只不过事件的名字不带on

    案例

    1. <html lang="en">
    2. <head>
    3. <meta charset="UTF-8">
    4. <title>vue事件处理</title>
    5. <script src="node_modules/vue/dist/vue.js"></script>
    6. </head>
    7. <body>
    8. <div id="app">
    9. <button @click="show">点我</button>
    10. </div>
    11. <script type="text/javascript">
    12. //创建vue对象
    13. var app = new Vue({
    14. //获取id为app的元素,该元素被vue对象所管理.只有被vue对象管理的标签,其内部才允许书写vue语法
    15. el:"#app",
    16. //定义vue的方法
    17. methods:{
    18. //定义show方法,弹出提示框
    19. show() {
    20. alert("Hello Vue!!!");
    21. }
    22. }
    23. });
    24. </script>
    25. </body>
    26. </html>

    5.2.事件修饰符

    **概述:**事件修饰符主要对事件的发生范围进行限定

    语法

    <button @事件名.事件修饰符="函数名/vue表达式">点我</button>

     分类:

    .stop :阻止事件冒泡, 也就是当前元素发生事件,但当前元素的父元素不发生该事件
    .prevent :阻止默认事件发生
    .capture :使用事件捕获模式, 主动获取子元素发生事件, 把获取到的事件当自己的事件执行
    .self :只有元素自身触发事件才执行。(冒泡或捕获的都不执行)
    .once :只执行一次

     案例

    1. <html lang="en">
    2. <head>
    3. <meta charset="UTF-8">
    4. <title>vue事件处理</title>
    5. <script src="node_modules/vue/dist/vue.js"></script>
    6. </head>
    7. <body>
    8. <div id="app">
    9. <button @click="show">点我</button>
    10. </div>
    11. <script type="text/javascript">
    12. //创建vue对象
    13. var app = new Vue({
    14. //获取id为app的元素,该元素被vue对象所管理.只有被vue对象管理的标签,其内部才允许书写vue语法
    15. el:"#app",
    16. //定义vue的方法
    17. methods:{
    18. //定义show方法,弹出提示框
    19. show() {
    20. alert("Hello Vue!!!");
    21. }
    22. }
    23. });
    24. </script>
    25. </body>
    26. </html>

    6.循环遍历(v-for)

    6.1.遍历数组

    语法

    v-for="item in items"
    v-for="(item,index) in items"

    items:要迭代的数组
    item:存储数组元素的变量名
    index:迭代到的当前元素索引,从0开始。

    代码

    1. <div id="app">
    2. <ul>
    3. <li v-for="(user, index) in users">
    4. {{index}}--{{user.name}}--{{user.age}}--{{user.gender}}
    5. </li>
    6. </ul>
    7. </div>
    8. <script>
    9. var app = new Vue({
    10. el:"#app",//el即element,要渲染的页面元素
    11. data: {
    12. users:[
    13. {"name":"白卓冉","age":8,"gender":"男"},
    14. {"name":"白大锅","age":12,"gender":"女"},
    15. {"name":"白仙女","age":4,"gender":"男"}
    16. ]
    17. }
    18. });
    19. </script>

    6.2.遍历对象

    语法

    v-for="value in object"
    v-for="(value,key) in object"
    v-for="(value,key,index) in object"

    value,对象的值
    key, 对象的键
    index, 索引,从0开始

    代码

    1. <div id="app">
    2. <ul>
    3. <li v-for="(value,key,index) in person">
    4. {{index}}--{{key}}--{{value}}
    5. </li>
    6. </ul>
    7. </div>
    8. <script>
    9. var app = new Vue({
    10. el:"#app",//el即element,要渲染的页面元素
    11. data: {
    12. person:{"name":"白大锅", "age":3, "address":"中国"}
    13. }
    14. });
    15. </script>

    6.3.key

    概述:

    ​ :key 一般配合v-for一起使用. 用来在特定情况下, 保证被遍历的数组中的元素的顺序.

    案例:

    1. <div id="app">
    2. <button @click="add">添加</button>
    3. <ul>
    4. <li v-for="name in list">
    5. <input type="checkbox"> {{name}}
    6. </li>
    7. </ul>
    8. </div>
    9. <script>
    10. var app = new Vue({
    11. el: '#app',
    12. data: {
    13. list: ["孙悟空", "猪八戒", "沙和尚"]
    14. },
    15. methods: {
    16. add() {
    17. //注意这里是unshift,向数组的头部添加一个元素
    18. this.list.unshift("唐僧");
    19. }
    20. }
    21. });
    22. </script>

    7.判断语法(v-if和v-show)

    概述:

    v-if与v-show可以根据条件的结果,来决定是否显示指定内容.

    ​ v-if: 条件不满足时, 元素不会存在.

    ​ v-show: 条件不满足时, 元素不会显示(但仍然存在).

    案例

    1. <div id="app">
    2. <button @click="show = !show">点我</button>
    3. <h1 v-if="show">Hello v-if.</h1>
    4. <h1 v-show="show">Hello v-show.</h1>
    5. </div>
    6. <script>
    7. var app = new Vue({
    8. el:"#app",
    9. data: {
    10. show:true
    11. }
    12. });
    13. </script>

    8.显示数据(v-bind)

    概述:

    v-bind的作用和插值表达式差不多, 只不过, v-bind主要用于动态设置标签的属性值

     语法

    <!--完整写法-->
    <标签名 v-bind:标签属性名="vue实例中的数据属性名"/>
    <!--简化写法-->
    <标签名 :标签属性名="vue实例中的数据属性名"/>

     案例

    1. <div id="app">
    2. <input type="button" :value="msg"/>
    3. </div>
    4. <script type="text/javascript">
    5. var app = new Vue({
    6. el:"#app",
    7. data:{
    8. msg:"我是按钮"
    9. }
    10. });
    11. </script>

    9.Vue页面跳转(两种方法)

    9.1.方法一(标签实现)

    1. <router-link :to="{name: 'bookshelf', params: { entityId: this.entityId } }"
    2. :class="{'flex-item-1':'flex-item-1',cur:tabs[0].isShow}" href="javascript:">
    3. <span class="tabNav-ico tabNav-book"></span>
    4. <span class="tabNav-txt">书 架</span>
    5. </router-link>

    9.1.方法二(this.$router.push()实现)

    当this.$router.push()只有一个参数时 默认为跳转地址 最多可传两个参数 第二个参数为地址参数

    1. <a @click="toIndex" :class="{'flex-item-1':'flex-item-1',cur:tabs[2].isShow}" href="javascript:">
    2. <span class="tabNav-ico tabNav-home"></span>
    3. <span class="tabNav-txt">首 页</span>
    4. </a>
    5. toIndex: function(){
    6. this.$router.push("/?entityId="+ localStorage.getItem("entityId"));
    7. }

    三、Vue其他语法

    3.1.计算属性

    概述

    计算属性就是一个提前定义好的方法, 该方法可以看作是一个特殊的值, 可以在插值表达式中使用.

    语法

     var app = new Vue({
         el:"#app",
         //计算属性必须放在Vue的computed中
         computed:{
             //定义计算属性
             属性名(){
                 return "返回值";
             }
         }
    });

    案例:

    1. <div id="app">
    2. <h1>{{birth}}</h1>
    3. <h1 v-text="birth"></h1>
    4. <h1 v-html="birth"></h1>
    5. </div>
    6. <script type="text/javascript">
    7. var app = new Vue({
    8. el:"#app",
    9. computed:{
    10. //定义一个birth方法,该方法就是一个计算属性,可以在插值表达式中使用
    11. birth(){
    12. let date = new Date();
    13. let year = date.getFullYear();
    14. let month = date.getMonth()+1;
    15. let day = date.getDay();
    16. return year + "-" + month + "-" + day;
    17. }
    18. }
    19. });
    20. </script>

     

    3.2.watch监控

    概述

    ​ watch可以监听简单属性值及其对象中属性值的变化.

    ​ watch类似于onchange事件,可以在属性值修改的时候,执行某些操作.

    语法

    var app = new Vue({
        el:"#app",
        data:{
            message:"白大锅",
            person:{"name":"heima", "age":13}
        },
        //watch监听
        watch:{
            //监听message属性值,newValue代表新值,oldValue代表旧值
            message(newValue, oldValue){
                console.log("新值:" + newValue + ";旧值:" + oldValue);
            },
            //监控person对象的值,对象的监控只能获取新值
            person: {
                //开启深度监控;监控对象中的属性值变化
                deep: true,
                //获取到对象的最新属性数据(obj代表新对象)
                handler(obj){
                    console.log("name = " + obj.name + "; age=" + obj.age);
                }
            }
        }
    });

    四、Vue组件

    4.1.基本使用

    概述:

    组件, 类似于模版, 模块. 在项目需要重用某个模块(头部、尾部、新闻。。。)的时候,可以将模块抽取成组件,其它页面中注册组件并引用。

    案例:

    1. <div id="app">
    2. <!--使用组件(组件名称),如果组件名称中有大写字母,如"myList",则这里需要书写<my-list>-->
    3. <counter></counter>
    4. <counter></counter>
    5. </div>
    6. <script type="text/javascript">
    7. //定义组件
    8. const counterTemp = {
    9. //定义组件的模版
    10. template:`<button @click='num++'>你点击了{{num}}次</button>`,
    11. //定义组件中使用到的数据属性
    12. data(){
    13. return {
    14. num:0
    15. }
    16. }
    17. };
    18. //全局注册组件:在所有的vue实例中都可以使用组件
    19. //参数1:组件名称,参数2:具体的组件
    20. //Vue.component("counter", counterTemp);
    21. var app = new Vue({
    22. el:"#app",
    23. //局部注册组件: 只能在当前Vue实例中使用
    24. components:{
    25. //组件名称:具体组件
    26. counter: counterTemp
    27. }
    28. });
    29. </script>

    注意:

    1. 组件的模版中, 只能书写一个跟标签
    2. 组件的定义必须放在Vue创建对象之前, 否则报错

    4.2.父组件向子组件通信

    概述:

    子组件无法直接使用父组件中的数据, 如果需要使用, 则必须由父组件把数据传递给子组件才可以.

    本质: 让子组件中的属性与父组件中的属性进行关联绑定, 然后子组件使用该属性, 这样才能做到数据传递

    意义:

    可以把父组件中的数据, 更新传递到子组件

    示例:

    1. <div id="app">
    2. <!-- 把父组件中的count传递给子组件的number属性,把父arr传递给子ids,把父p传递给子person -->
    3. <aaa :number="count" :ids="arr" :person="p"></aaa>
    4. </div>
    5. <script>
    6. var aaa = {
    7. //定义组件的模版
    8. template: `<h2>{{num}}---{{number}}--{{ids}}--{{person}}</h2>`,
    9. //定义组件中使用到的数据属性
    10. data() {
    11. return {
    12. num: 0
    13. }
    14. },
    15. //给组件添加属性
    16. props: {
    17. //普通属性number
    18. number: "",
    19. //数组属性ids
    20. ids: [],
    21. //对象属性person
    22. person: {}
    23. /*
    24. * //以上属性还可以书写为以下格式
    25. * items:{
    26. * //数据类型,如果是数组则是Array,如果是对象则是Object
    27. * type:Array,
    28. * //默认值
    29. * default:[]
    30. * }
    31. */
    32. }
    33. };
    34. //注册:全局注册
    35. Vue.component("aaa", aaa);
    36. var app = new Vue({
    37. el: "#app",
    38. data: {
    39. count: 5,
    40. arr: [1, 2, 3],
    41. p: {username: "zhangsan", age: 23}
    42. }
    43. });
    44. </script>

    4.3.子组件向父组件通信

    概述:

    子组件无法直接给父组件传递数据. 也无法操作父组件中的数据, 更无法调用父组件中的方法.

    所以, 所谓的子组件向父组件通讯, 其实就是想办法让子组件调用父组件的方法. 进而响应到父组件中的数据.

    意义:

    子组件可以调用父组件中的方法

    示例:

    1. <div id="app">
    2. <h1>父组件中:app_num={{app_num}}</h1>
    3. <!-- 把父组件的add方法,绑定给子组件的aaa属性,绑定方法使用@属性名="方法名" -->
    4. <!-- 把父组件的rem方法,绑定给子组件的bbb属性,绑定方法使用@属性名="方法名 -->
    5. <!-- 把父组件的app_num变量,绑定给子组件的counter_num属性,绑定变量使用:属性名="方法名 -->
    6. <counter @aaa="add" @bbb="rem" :counter_num="app_num"></counter>
    7. </div>
    8. <script>
    9. //定义一个组件(模版)
    10. let counter = {
    11. template: `
    12. <div>
    13. <h1>子组件中:counter_num={{counter_num}}</h1>
    14. <input type="button" @click="fun1" value="+"/>
    15. <input type="button" @click="fun2" value="-"/>
    16. </div>
    17. `,
    18. props:{
    19. //定义属性counter_num,用来接收父组件传递的数据
    20. counter_num:null,
    21. //定义aaa属性,用来绑定父组件的方法,当然,该定义也可以省略
    22. aaa:function(){},
    23. //定义bbb属性,用来绑定父组件的方法,当然,该定义也可以省略
    24. bbb:function(){},
    25. },
    26. methods:{
    27. fun1(){
    28. //找到aaa属性所绑定的那个方法,执行那个方法
    29. return this.$emit("aaa");
    30. },
    31. fun2(){
    32. //找到bbb属性所绑定的那个方法,执行那个方法
    33. return this.$emit("bbb");
    34. }
    35. }
    36. }
    37. var app = new Vue({
    38. el: '#app',
    39. data: {
    40. app_num: 0
    41. },
    42. components: {
    43. counter
    44. },
    45. methods:{
    46. add(){
    47. this.app_num++;
    48. },
    49. rem(){
    50. this.app_num--;
    51. }
    52. }
    53. });
    54. </script>

    五、axios异步请求

    5.1 axios概述

    概述:

    axios是一个基于 promise 的 HTTP 库, 主要用于:发送异步请求获取数据

    常见的方法:

    ​ axios(config)

    ​ axios.get(url, [config])

    ​ axios.post(url, [data])

     发送数据config常用参数:

    1. {
    2. url: '请求的服务器',
    3. method: '请求方式', // 默认是 get
    4. // GET请求参数
    5. params: {
    6. 参数名: 参数值
    7. },
    8. // POST请求参数, 如果使用axios.post,则参数在url之后直接书写,不需要该位置传递参数
    9. data: {
    10. 参数名: 参数值
    11. },
    12. // 响应数据格式,默认json
    13. responseType: 'json'
    14. }

    响应数据常用参数:

    1. {
    2. data: {}, //真正的响应数据(响应体)
    3. status: 200, //响应状态码
    4. statusText: 'OK', //响应状态描述
    5. headers: {}, //响应头
    6. config: {} //其他配置信息
    7. }

    5.2.Get请求

    1. var app = new Vue({
    2. el: "#app",
    3. data: {
    4. user: {}
    5. },
    6. //当页面加载完毕后
    7. created() {
    8. //发送GET请求axios.get("请求路径",{ config });
    9. axios.get("请求路径",{
    10. //get请求参数
    11. params: {
    12. name:"zhangsan",
    13. age:23
    14. },
    15. //响应数据格式为"json"
    16. responseType: 'json'
    17. }).then(res => {
    18. //打印响应数据
    19. console.log(res);
    20. //把响应数据赋值给Vue中的user属性
    21. app.user = res.data;
    22. }).catch(err => {
    23. //打印响应数据(错误信息)
    24. console.log(err);
    25. });
    26. }
    27. });

    5.3.Post请求

    1. var app = new Vue({
    2. el: "#app",
    3. data: {
    4. user: {}
    5. },
    6. //当页面加载完毕后
    7. created() {
    8. //发送POST请求axios.post("请求路径",{ 参数 });
    9. axios.post("请求路径",{
    10. name:"zhangsan",
    11. age:23
    12. }).then(res => {
    13. console.log(res);
    14. app.user = res.data;
    15. }).catch(err => {
    16. console.log(err);
    17. });
    18. }
    19. });

    5.4.跨域请求

    六、VueJs Ajax

    6.1.vue-resource

    vue-resource是Vue.js的插件提供了使用XMLHttpRequest或JSONP进行Web请求和处理响应的服务。 当vue更新
    到2.0之后,作者就宣告不再对vue-resource更新,而是推荐的axios,在这里大家了解一下vue-resource就可以。
    vue-resource的github: https://github.com/pagekit/vue-resource

    6.2.axios

    Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中
    axios的github:GitHub - axios/axios: Promise based HTTP client for the browser and node.js

    6.2.1.引入axios

    首先就是引入axios,如果你使用es6,只需要安装axios模块之后
    import axios from ‘axios’;
    //安装方法
    npm install axios
    //或
    bower install axios

     当然也可以用script引入

    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    

    6.2.2.get请求

    1. //通过给定的ID来发送请求
    2. axios.get('/user?ID=12345')
    3. .then(function(response){
    4. console.log(response);
    5. }).catch(function(err){
    6. console.log(err);
    7. });
    8. //以上请求也可以通过这种方式来发送
    9. axios.get('/user',{
    10. params:{
    11. ID:12345
    12. }
    13. }).then(function(response){
    14. console.log(response);
    15. }).catch(function(err){
    16. console.log(err);
    17. });

    6.2.3.post请求

    1. axios.post('/user',{
    2. firstName:'Fred',
    3. lastName:'Flintstone'
    4. })
    5. .then(function(res){
    6. console.log(res);
    7. })
    8. .catch(function(err){
    9. console.log(err);
    10. });

    为方便起见,为所有支持的请求方法提供了别名

    1. axios.request(config)
    2. axios.get(url[, config])
    3. axios.delete(url[, config])
    4. axios.head(url[, config])
    5. axios.post(url[, data[, config]])
    6. axios.put(url[, data[, config]])
    7. axios.patch(url[, data[, config]])

    七、综合案例

    7.1.需求

    完成用户的查询与修改操作

    7.2. 数据库设计与表结构

    1. CREATE DATABASE vuejsdemo;
    2. USE vuejsdemo;
    3. CREATE TABLE USER(
    4. id INT PRIMARY KEY AUTO_INCREMENT,
    5. age INT,
    6. username VARCHAR(20),
    7. PASSWORD VARCHAR(50),
    8. email VARCHAR(50),
    9. sex VARCHAR(20)
    10. )

    User类

    1. public class User {
    2. private Integer id;
    3. private String username;
    4. private String password;
    5. private String sex;
    6. private int age;
    7. private String email;
    8. 省略getter/setter

    7.3.服务器端

    7.3.1.配置文件

    web.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
    5. http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
    6. version="3.1"
    7. metadata-complete="true">
    8. <!-- 手动指定 spring 配置文件位置 -->
    9. <context-param>
    10. <param-name>contextConfigLocation</param-name>
    11. <param-value>classpath:applicationContext.xml</param-value>
    12. </context-param>
    13. <!-- 配置 spring 提供的监听器,用于启动服务时加载容器 。
    14. 该间监听器只能加载 WEB-INF 目录中名称为 applicationContext.xml 的配置文件 -->
    15. <listener>
    16. <listener-class>
    17. org.springframework.web.context.ContextLoaderListener
    18. </listener-class>
    19. </listener>
    20. <!-- 配置 spring mvc 的核心控制器 -->
    21. <servlet>
    22. <servlet-name>springmvcDispatcherServlet</servlet-name>
    23. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    24. <!-- 配置初始化参数,用于读取 springmvc 的配置文件 -->
    25. <init-param>
    26. <param-name>contextConfigLocation</param-name>
    27. <param-value>classpath:springmvc.xml</param-value>
    28. </init-param>
    29. <!-- 配置 servlet 的对象的创建时间点:应用加载时创建。取值只能是非 0 正整数,表示启动顺
    30. 序 -->
    31. <load-on-startup>1</load-on-startup>
    32. </servlet>
    33. <servlet-mapping>
    34. <servlet-name>springmvcDispatcherServlet</servlet-name>
    35. <url-pattern>*.do</url-pattern>
    36. </servlet-mapping>
    37. <!-- 配置 springMVC 编码过滤器 -->
    38. <filter>
    39. <filter-name>CharacterEncodingFilter</filter-name>
    40. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    41. <!-- 设置过滤器中的属性值 -->
    42. <init-param>
    43. <param-name>encoding</param-name>
    44. <param-value>UTF-8</param-value>
    45. </init-param>
    46. <!-- 启动过滤器 -->
    47. <init-param>
    48. <param-name>forceEncoding</param-name>
    49. <param-value>true</param-value>
    50. </init-param>
    51. </filter>
    52. <!-- 过滤所有请求 -->
    53. <filter-mapping>
    54. <filter-name>CharacterEncodingFilter</filter-name>
    55. <url-pattern>/*</url-pattern>
    56. </filter-mapping>
    57. <welcome-file-list>
    58. <welcome-file>index.html</welcome-file>
    59. <welcome-file>index.htm</welcome-file>
    60. <welcome-file>index.jsp</welcome-file>
    61. <welcome-file>default.html</welcome-file>
    62. <welcome-file>default.htm</welcome-file>
    63. <welcome-file>default.jsp</welcome-file>
    64. </welcome-file-list>
    65. </web-app>

    springmvc.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:mvc="http://www.springframework.org/schema/mvc"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans.xsd
    8. http://www.springframework.org/schema/mvc
    9. http://www.springframework.org/schema/mvc/spring-mvc.xsd
    10. http://www.springframework.org/schema/context
    11. http://www.springframework.org/schema/context/spring-context.xsd">
    12. <!-- 配置创建 spring 容器要扫描的包 -->
    13. <context:component-scan base-package="com.itheima">
    14. <!-- 制定扫包规则 ,只扫描使用@Controller 注解的 JAVA 类 -->
    15. <context:include-filter type="annotation"
    16. expression="org.springframework.stereotype.Controller"/>
    17. </context:component-scan>
    18. <mvc:annotation-driven></mvc:annotation-driven>
    19. </beans>

    applicationContext.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:aop="http://www.springframework.org/schema/aop"
    5. xmlns:tx="http://www.springframework.org/schema/tx"
    6. xmlns:context="http://www.springframework.org/schema/context"
    7. xsi:schemaLocation="http://www.springframework.org/schema/beans
    8. http://www.springframework.org/schema/beans/spring-beans.xsd
    9. http://www.springframework.org/schema/tx
    10. http://www.springframework.org/schema/tx/spring-tx.xsd
    11. http://www.springframework.org/schema/aop
    12. http://www.springframework.org/schema/aop/spring-aop.xsd
    13. http://www.springframework.org/schema/context
    14. http://www.springframework.org/schema/context/spring-context.xsd">
    15. <!-- 配置 spring 创建容器时要扫描的包 -->
    16. <context:component-scan base-package="com.itheima">
    17. <!--制定扫包规则,不扫描@Controller 注解的 JAVA 类,其他的还是要扫描 -->
    18. <context:exclude-filter type="annotation"
    19. expression="org.springframework.stereotype.Controller"/>
    20. </context:component-scan>
    21. <!-- 加载配置文件 -->
    22. <context:property-placeholder location="classpath:db.properties"/>
    23. <!-- 配置 MyBatis 的 Session 工厂 -->
    24. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    25. <!-- 数据库连接池 -->
    26. <property name="dataSource" ref="dataSource"/>
    27. <!-- 加载 mybatis 的全局配置文件 -->
    28. <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
    29. </bean>
    30. <!-- 配置数据源 -->
    31. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
    32. <property name="driverClass" value="${jdbc.driver}"></property>
    33. <property name="jdbcUrl" value="${jdbc.url}"></property>
    34. <property name="user" value="${jdbc.username}"></property>
    35. <property name="password" value="${jdbc.password}"></property>
    36. </bean>
    37. <!-- 配置 Mapper 扫描器 -->
    38. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    39. <property name="basePackage" value="com.itheima.dao"/>
    40. </bean>
    41. <tx:annotation-driven/>
    42. <!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
    43. <bean id="transactionManager"
    44. class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    45. <property name="dataSource" ref="dataSource"/>
    46. </bean>
    47. </beans>

    db.properties

    1. jdbc.driver=com.mysql.jdbc.Driver
    2. jdbc.url=jdbc:mysql://localhost:3306/vuejsDemo
    3. jdbc.username=root
    4. jdbc.password=root

    7.3.2.Controller

    1. @RequestMapping("/user")
    2. @Controller
    3. @ResponseBody
    4. public class UserController {
    5. @Autowired
    6. private IUserService userService;
    7. @RequestMapping(value="/findAll.do")
    8. public List<User> findAll() {
    9. return userService.findAll();
    10. }
    11. @RequestMapping(value="/findById.do")
    12. public User findById(Integer id) {
    13. return userService.findById(id);
    14. }
    15. @RequestMapping(value="/update.do")
    16. public User update(@RequestBody User user) {
    17. return userService.update(user);
    18. }
    19. }

    7.3.3.Dao

    1. public interface IUserDao {
    2. @Select("select * from user")
    3. public List<User> findAll();
    4. @Select("select * from user where id=#{id}")
    5. User findById(Integer id);
    6. @Update("update user set username=#{username},password=#{password},sex=#{sex},age=#
    7. {age},email=#{email} where id=#{id}")
    8. void update(User user);
    9. }

    7.4.客户端

    7.4.1.user.html页面

    原因种种 页面代码暂时提供不了 思路大概就是这些 嘻嘻~

    7.4.2.user.js

    1. var vue = new Vue({
    2. el: "#app",
    3. data: {
    4. user: {id:"",username:"aaa",password:"",age:"",sex:"",email:""},
    5. userList: []
    6. },
    7. methods: {
    8. findAll: function () {
    9. var _this = this;
    10. axios.get("/vuejsDemo/user/findAll.do").then(function (response) {
    11. _this.userList = response.data;
    12. console.log(_this.userList);
    13. }).catch(function (err) {
    14. console.log(err);
    15. });
    16. },
    17. findById: function (userid) {
    18. var _this = this;
    19. axios.get("/vuejsDemo/user/findById.do", {
    20. params: {
    21. id: userid
    22. }
    23. }).then(function (response) {
    24. _this.user = response.data;
    25. $('#myModal').modal("show");
    26. }).catch(function (err) {
    27. });
    28. },
    29. update: function (user) {
    30. var _this = this;
    31. axios.post("/vuejsDemo/user/update.do",_this.user).then(function (response) {
    32. _this.findAll();
    33. }).catch(function (err) {
    34. });
    35. }
    36. },
    37. created(){
    38. this.findAll();
    39. }
    40. });

  • 相关阅读:
    Vue2与Vue3实例的深入比较:响应式系统、模板编译和性能分析
    算法入门教程(一、模拟)
    Elasticsearch Mapping类型修改
    十.EtherCAT开发之microchip MCU D51+ LAN9253 的开发COE应用(SPI directly 模式)
    [附源码]计算机毕业设计JAVA网上宠物商店
    爱创科技总裁谢朝晖荣获“推动医药健康产业高质量发展人物”
    Windows+Visual stdio+CUDA编程方式及测试
    CSS学习笔记
    城市消防无人机控制系统的设计
    ES6学习笔记
  • 原文地址:https://blog.csdn.net/Cc200171/article/details/125598781