zoukankan      html  css  js  c++  java
  • Vue

    Vue

    渐进式JavaScript框架

    通过对框架的了解与运算程度,来决定其在整个项目中的应用范围,最终可以独立以框架方式完成整个web前端项目

    什么是Vue

    可以独立完成前后端分离式web项目的JavaScript框架

    为什么要学习Vue

    三大主流框架之一:Angular React Vue
    先进的前端设计模式:MVVM
    可以完全脱离服务器端,以前端代码复用方式渲染整个页面:组件开发

    特点

    单页面web应用
    数据驱动
    数据的双向绑定
    虚拟DOM

    如何使用Vue

    #1.下载:https://vuejs.org/js/vue.min.js
    #2.导入vue.js
    #3.在自定义的script标签中创建vue对象
    #4.用vue对象来控制页面内容
    <div id="app">
        {{  }}
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        new Vue({
        el:"#qpp"
      })
    </script>

    挂载点与数据渲染

    <body>
      <div id="app">
          <!-- 插值表达式:插值表达式中出现的名字代表vue变量-->
          <div class="root">{{ abc }}</div>
          <div class="main">{{ xyz }}</div>
      </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        //挂载点:vue对象通过el参数(挂载点)与页面结构建立联系,vue对象与页面的结构应该是一对一关系,所以挂载点选择id作为唯一标识
        // new Vue({
        //     el:'.root'
        // });
        new Vue({
            el: '#app',
          //在挂载点插值表达式中出现的名字是变量,需要vue对象通过data提供
            data: {
                abc: '内容',
                xyz: 3.14,
            }
        });
    </script>

    Vue实例

    <body>
    <div id="app">
        {{ msg }}
    </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        //vue实例(对象)
        let app = new Vue({
            el: '#app',
            data: {
                msg: 'message'
            }
        });
    </script>
    <script>
        //如何访问'message'
        // console.log(app);
        console.log(app.$el);
        //vue的变量都是以¥开头
        // console.log(app.$data.msg)
        //vue实例(对象)就是挂载点
        console.log(app.msg)
    </script>

    实例的methods

    <div id="app">
        <!-- v-on来为事件绑定方法,事件用 :事件名 标注 -->
        <!-- 语法:v-on:事件名 = "事件变量" -->
        <!-- 事件变量:由vue实例的methods提供 -->
        <button v-on:click="btnClick">{{ msg }}</button>
    </div>
    <script src="js/vue.min.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                msg: "按钮"
            },
            methods: {
                btnClick: function () {
                    alert('点击事件')
                }
            }
        });
    </script>

    案例:通过事件修改标签样式

    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .btn {
                width: 100px;
                height: 40px;
                background-color: orange;
            }
    
            .button {
                width: 100px;
                height: 40px;
                background-color: yellowgreen;
            }
        </style>
    </head>
    <body>
    <div id="app">
        <!-- v-on来为事件绑定方法,事件用法:事件名 标注-->
        <!-- 语法:v--on:事件名 ='事件变量'-->
        <!--事件变量:由vue实例的methods提供-->
        <button v-on:click="btnClick" v-bind:style="my_style" v-bind:class="my_cls">{{ msg }}</button>
        <!--v-bind来为属性绑定变量,属性用:属性名 标注 eg: :style :class :id-->
        <!--语法:v-bind:属性名 ='属性变量'-->
        <!--事件变量:由vue实例的data提供-->
    </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                msg: '按钮',
                my_style: {
                    // background: 'red'
                },
                my_cls: 'btn'
            },
            methods: {
                btnClick: function () {
                    // alert('123')
                    // console.log(this.my_style.background)
                    // this.my_style.background = 'pink';
                  //修改类名就能直接对应一套css样式
                    if (this.my_cls == 'btn') {
                        this.my_cls = 'button'
                    } else {
                        this.my_cls = 'btn'
                    }
                }
            }
        })
    </script>
    </html>

    实例的computed

    #comouted功能:将function封装给一个变量,通过该变量就可以得到该function的返回值
    #应用场景:一个变量(name)依赖于多个变量(first_name+last_name)的值
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .span {
                color: red;
            }
        </style>
    </head>
    <body>
    <div id="app">
        <!--v-model就是为表单元素 value属性绑定变量-->
        <p>姓:<input type="text" placeholder="姓" v-model="first_name"></p>
        <p>名:<input type="text" placeholder="名" v-model="last_name"></p>
        <p>
            <!--插值表达式中可以书写 变量表达式-->
            <!--姓名:<span class="span">{{ first_name + last_name }}</span>-->
            <!--姓名:<span class="span" v-on:click="my_name">{{ name }}</span>-->
            <!--<span class="span">{{ name() }}</span>-->
            姓名:<span class="span">{{ name }}</span>
        </p>
    </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        //vue实例(对象)
        let app = new Vue({
            el: '#app',
            data: {
                first_name: '',
                last_name: '',
                //name:'姓名',
            },
            // methods: {
            //     my_name: function () {
            //         this.name = this.first_name + this.last_name
            //     },
            // },
            computed: {
                name: function () {
                    if (this.first_name == '' && this.last_name == '') {
                        return '姓名'
                    } else {
                        return this.first_name + this.last_name
                    }
                }
            }
        });
    </script>
    </html>

    实例的watch方法

    #watch是用来监听变量的,当监听的变量的值一旦发生变化,就会触发监听的函数
    #应用场景:多个变量(first_name、last_name)依赖于一个变量(name)
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        <p>
            姓名:<input type="text" placeholder="姓名" v-model="name">
        </p>
        <p>姓:{{ first_name }}</p>
        <p>名:{{ last_name }}</p>
    </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        let app = new Vue({
            el: '#app',
            data: {
                name: '',
                first_name: '',
                last_name: '',
            },
            //watch是用来监听变量的,当监听的变量的值一旦发生变化,就会触发监听的函数
            //应用场景:多个变量(first_name、last_name)依赖于一个变量(nam,e)
            watch: {
                name: function () {
                    // console.log('name 值改变了');
                    // console.log(this.name);
                    this.first_name = this.name[0];
                    this.last_name = this.name[1];
                }
            }
        })
    </script>
    </html>

    实例的delimiters

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="main">
        <!--查找表达式{{  }}符号与其他语言冲突,可以自定义表达式的符号-->
        <!--实例的delimiters:['左侧符号','右侧符号']-->
        {{ msg }}{{{ msg }}}${ msg }
    </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        //vue实例(对象)
        new Vue({
            el: '#main',
            data: {
                msg: '信息'
            },
            // delimiters: ['{{{', '}}}'],
            delimiters: ['${', '}']
        })
    </script>
    </html>

    实例的生命周期钩子

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <div id="app">
        {{ msg }}
    </div>
    </body>
    <script src="js/vue.min.js"></script>
    <script>
        new Vue({
            el: '#app',
            data: {
                msg: 'message'
            },
            methods: {
                fn: function () {
                    return '123'
                }
            },
            beforeCreate: function () {
                console.log('实例化被创建了');
                console.log(this.msg);//undefined
            },
            created: function () {
                console.log('实例已经创建');
                console.log(this.msg);//message
                console.log(this.$el);//undefined
            },
            mounted: function () {
                console.log('实例已经渲染到页面');
                console.log(this.msg);//message
                console.log(this.$el);//有值
                console.log(this.fn)//有值
            }
        })
    </script>
    </html>

      所有的生命周期钩子自动绑定 this 上下文到实例中,因此你可以访问数据,对属性和方法进行运算。

      这意味着你不能使用箭头函数来定义一个生命周期方法 (例如 created: () => this.fetchTodos())。

      这是因为箭头函数绑定了父上下文,因此 this 与你期待的 Vue 实例不同,this.fetchTodos 的行为未定义。

    beforeCreate

    • 类型Function

    • 详细

      在实例初始化之后,数据观测 (data observer) 和 event/watcher 事件配置之前被调用。

    created

    • 类型Function

    • 详细

      在实例创建完成后被立即调用。在这一步,实例已完成以下的配置:数据观测 (data observer),属性和方法的运算,watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

    beforeMount

    • 类型Function

    • 详细

      在挂载开始之前被调用:相关的 render 函数首次被调用。

      该钩子在服务器端渲染期间不被调用。

    mounted

    • 类型Function

    • 详细

      el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。如果 root 实例挂载了一个文档内元素,当 mounted 被调用时 vm.$el 也在文档内。

      注意 mounted 不会承诺所有的子组件也都一起被挂载。如果你希望等到整个视图都渲染完毕,可以用 vm.$nextTick 替换掉 mounted

      mounted: function () {
        this.$nextTick(function () {
          // Code that will run only after the
          // entire view has been rendered
        })
      }
      该钩子在服务器端渲染期间不被调用。 

    beforeUpdate

    • 类型Function

    • 详细

      数据更新时调用,发生在虚拟 DOM 打补丁之前。这里适合在更新之前访问现有的 DOM,比如手动移除已添加的事件监听器。

      该钩子在服务器端渲染期间不被调用,因为只有初次渲染会在服务端进行。

    updated

    • 类型Function

    • 详细

      由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

      当这个钩子被调用时,组件 DOM 已经更新,所以你现在可以执行依赖于 DOM 的操作。然而在大多数情况下,你应该避免在此期间更改状态。如果要相应状态改变,通常最好使用计算属性watcher 取而代之。

      注意 updated 不会承诺所有的子组件也都一起被重绘。如果你希望等到整个视图都重绘完毕,可以用 vm.$nextTick 替换掉 updated

      updated: function () {
        this.$nextTick(function () {
          // Code that will run only after the
          // entire view has been re-rendered
        })
      } 

      该钩子在服务器端渲染期间不被调用。

    activated

    • 类型Function

    • 详细

      keep-alive 组件激活时调用。

      该钩子在服务器端渲染期间不被调用。

    deactivated

    • 类型Function

    • 详细

      keep-alive 组件停用时调用。

      该钩子在服务器端渲染期间不被调用。 

    beforeDestroy

    • 类型Function

    • 详细

      实例销毁之前调用。在这一步,实例仍然完全可用。

      该钩子在服务器端渲染期间不被调用。

    destroyed

    • 类型Function

    • 详细

      Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。

      该钩子在服务器端渲染期间不被调用。

    errorCaptured

      2.5.0+ 新增

    • 类型(err: Error, vm: Component, info: string) => ?boolean

    • 详细

      当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。此钩子可以返回 false 以阻止该错误继续向上传播。

      你可以在此钩子中修改组件的状态。因此在模板或渲染函数中设置其它内容的短路条件非常重要,它可以防止当一个错误被捕获时该组件进入一个无限的渲染循环。

      错误传播规则

      • 默认情况下,如果全局的 config.errorHandler 被定义,所有的错误仍会发送它,因此这些错误仍然会向单一的分析服务的地方进行汇报。

      • 如果一个组件的继承或父级从属链路中存在多个 errorCaptured 钩子,则它们将会被相同的错误逐个唤起。

      • 如果此 errorCaptured 钩子自身抛出了一个错误,则这个新错误和原本被捕获的错误都会发送给全局的 config.errorHandler

      • 一个 errorCaptured 钩子能够返回 false 以阻止错误继续向上传播。本质上是说“这个错误已经被搞定了且应该被忽略”。它会阻止其它任何会被这个错误唤起的 errorCaptured 钩子和全局的 config.errorHandler

  • 相关阅读:
    hdu 4710 Balls Rearrangement()
    hdu 4707 Pet(DFS水过)
    hdu 4706 Children's Day(模拟)
    hdu 4712 Hamming Distance(随机函数暴力)
    csu 1305 Substring (后缀数组)
    csu 1306 Manor(优先队列)
    csu 1312 榜单(模拟题)
    csu 1303 Decimal (数论题)
    网络爬虫
    Python处理微信利器——itchat
  • 原文地址:https://www.cnblogs.com/ShenJunHui6/p/10858454.html
Copyright © 2011-2022 走看看