• Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)


    Vue.js+vue-element搭建属于自己的后台管理模板:Vue.js快速入门(二)

    前言

    上篇文章对Vue.js有了初步理解,接下来我们把Vue.js基础语法快速的过一遍,先混个脸熟留个印象就好。Vue.js基础主要包括,生命周期,数据绑定,过滤器,方法,计算属性,内置指令,组件,自定义指令,Render函数。

    Vue实例与数据绑定

    通过构造函数Vue就可以创建一个Vue的根实例,el挂载DOM对象,data绑定数据,页面文本中通过插值显示data数据,插值方式为{{}}双大括号,如<div>{{ name }}</div>。Vue实例中data数据就是Model它默认就是双向绑定的,我们通过维护data数据来可以实时改变视图展示内容。注意:如果有些数据改变不影响视图的变量,尽量不要在data中定义它,因为这样会增加效率问题。

    var app = new Vue({
        el: '#app', //el指定一个页面中已存在的DOM元素来挂载VUE实例
        data() {
              return {
                 name: ''
             };
        }
    })

    Vue.js生命周期

    每个框架都有它的生命周期,每个Vue实例创建时,都会经历一系列的初始化过程,同时也会调用相应的生命周期钩子,我们可以利用这些钩子,在适合的时机执行我们的业务逻辑。

    • created:实例创建完成后调用,但尚未挂载,$el还不可用。
    • mounted:el挂载到实例上后调用,一般第一个业务逻辑在这里开始。
    • beforeDestroy:实例销毁之前调用。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <div id="app">
            <h1>{{ date }}</h1>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data() {
                    return {
                        date: new Date()
                    };
                },
                created: function () { //实例创建完成后调用,但尚未挂载,$el还不可用。
                    console.log(this.$el)  //undefined
                },
                mounted: function () { //el挂载到实例上后调用,一般第一个业务逻辑在这里开始。
                    var e = this;
                    this.timer = setInterval(() => {
                        e.date = new Date();
                    }, 1000);
                },
                beforeDestroy: function () { //实例销毁之前调用。
                    this.timer && clearInterval(this.timer);
                }
            })
        </script>
    </body>
    </html>

     生命周期图示:(官方提供)

    过滤器

    Vue.js 支持在{{ }}插值的尾部添加一个管道符“|”,对数据进行过滤,经常用于格式化文本,例如对时间进行格式化处理。过滤器可以串联多个,而且还可以接收参数,默认第一个参数为数据本身。过滤器适用于简单的文本转换,如果要实现复杂的数据变换,应该使用计算属性去处理,计算属性在后面介绍它的用法。

    • filters:过滤器选项中创建每个过滤器,过滤规则是自定义的,例:filterA: function(value){}。
    • 管道符:管道符“|”出现在文本插值后面,进行过滤前面数据,例:{{ data | filterA }}。
    • 串联:过滤器也可以串联,数据后面设定多个过滤器,例:{{ message | filterA | filterB }}。
    • 多个参数:每个过滤器可以设定多个参数,例:{{ message | filterA('arg1', 'arg2') }},arg1为过滤器第2个参数,arg2为过滤器第3个参数,因为默认第一个参数为数据本身。
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <div id="app">
        <h1>{{ date | filterA }}</h1>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      <script>
        var app = new Vue({
          el: '#app',
          data() {
            return {
              date: new Date()
            };
          },
          filters: {
            filterA: (value) => {
              let date = new Date(value),
                y = date.getFullYear(),
                m = date.getMonth() + 1,
                d = date.getDate(),
                hh = date.getHours(),
                mm = date.getMinutes(),
                ss = date.getSeconds();
              var dt = y + '-' + (m > 9 ? m : '0' + m) + '-' + (d > 9 ? d : '0' + d) + ' ' +
                (hh > 9 ? hh : '0' + hh) + ':' + (mm > 9 ? mm : '0' + mm) + ':' + (ss > 9 ? ss : '0' + ss);
              return dt;
            }
          }
        })
      </script>
    </body>
    </html>

    方法

    methods 声明所有绑定事件监听器实现的方法,每个方法以函数形式声明,实例方法内可以直接使用this获取或修改数据,也可以调用其他申明的方法,外部也可以通过实例去调用。下面实例中用到了v-if="show",这是内置指令后面会详细介绍,@click="hide" 这也是内置指令v-on它是用来绑定事件监听器,@是语法糖,这里主要说明一下方法hide()调用的时候()可以省略。关于箭头函数,作用域不同,根据实际需求选择使用它。

    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <meta http-equiv="X-UA-Compatible" content="ie=edge">
      <title>Document</title>
    </head>
    <body>
      <div id="app">
        <input type="button" value="点击隐藏1" @click="hide">
        <input type="button" value="点击隐藏2" @click="hide2">
        <h1 v-if="show">{{ message }}</h1>
        <h1 v-if="show">{{ getmessage() }}</h1>
      </div>
      <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
      <script>
        var app = new Vue({
          el: '#app',
          data() {
            return {
              show: true,
              message: 'HelloWord!'
            };
          },
          methods: {
            hide: function(){
              //console.log(this.show);
              this.show = false;
            },
            hide2: ()=>{  //箭头函数作用域不一样,通过this无法改变数据。
              console.log(this.show);  // undefined
              this.show = false;
              //app.show =false; //通过实例调用来完成修改数据
            },
            getmessage: function(){
              return this.message; //带返回值方法,可以在插值中输出
            }
          }
        })
      </script>
    </body>
    </html>

    计算属性

    computde计算属性,模板内的表达式仅用于简单的运算,复杂的逻辑都可以通过计算属性代替,计算属性是基于它的依赖缓存的,一个计算属性所依赖的数据发生变化时,它才会重新取值。计算属性还可以返回多个Vue实例的数据,其中一个数据变化,计算属性会重新被执行。

    • computde:计算属性选项。
    • 用法:计算属性包含get和set函数,默认不写只触发getter函数来读取。
    • 缓存:计算属性与方法不一样地方,它是依赖数据发生变化时才会重新计算,高效率。
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <div id="app">
            <input type="button" value="点击" @click="onmode">
            <h1>{{ count }} </h1>
            <h1>{{ cpdate }} </h1>
            <p>Original message: "{{ message }}"</p>
            <p>Computed reversed message: "{{ reversedMessage }}"</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data() {
                    return {
                        count: 0,
                        date: '',
                        message: 'Hello'
                    };
                },
                methods: {
                    onmode: function () {
                        this.count++;
                    }
                },
                computed: {
                    reversedMessage: function () {
                        return this.message.split('').reverse().join('')
                    },
                    cpdate: function () {
                        //var d = this.count; //当计算属性中依赖属性发生变化时,会被重新计算。
                        this.date = new Date();
                        return this.date;
                    }
                }
            })
        </script>
    </body>
    </html>

    内置指令

    指令 (Directives) 是带有 v- 前缀的特殊属性,指令是Vue模板中最常用的一项功能,它带有前缀v-,主要职责就是当其表达式的值改变时,将某些行为应用到DOM上。

    • v-if:条件渲染指令,动态在DOM内添加或删除DOM元素。
    • v-else:条件渲染指令,必须跟v-if成对使用。
    • v-else-if:判断多层条件,必须跟v-if成对使用。
    • v-show:条件渲染指令,为DOM设置css的style属性,v-show不能在<template>上使用,频繁切换场景中适合使用。
    • v-text:更新元素的textContent;例如:<span v-text="msg"></span> 等同于 < span>{{msg}} </ span>。
    • v-html:更新元素的innerHTML;会把标签名也带上。
    • v-for:循环指令;<li v-for="book in books">{ { book.name } }</li>
    • v-for:表达式遍历数组时支持一个可选参数作为当前项的索引;<li v-for="(book , index) in books ">{{ index}} - {{book.name })</li>
    • v-for:表达式遍历对象属性时,有两个可选参数,分别是键名和索引;<li v-for="(value , key , index) in user ">{ { index } } - { { key } } : { { value } }</li>
    • v-cloak:不需要表达式,这个指令保持在元素上直到关联实例结束编译; v-cloak 是一个解决初始化慢导致页面闪动的最佳实践。
    • v-once:也是一个不需要表达式的指令,作用是定义它的元素或组件只渲染一次,包括元素或组件的所有子节点。
    • v-pre:不需要表达式,跳过这个元素以及子元素的编译过程,以此来加快整个项目的编译速度。
    • v-bind:响应并更新DOM特性;例如:v-bind:href  v-bind:class  v-bind:title  等等。语法糖:"v-bind:” 可以用":"代替。
    • v-on:用于监听DOM事件; 例如:v-on:click  v-on:keyup。语法糖:“v-on:”可以用“@”代替。
    • v-model:数据双向绑定;用于表单输入等;例如:< input v-model= "message">。v-model也是一个特殊的语法糖,使用@input来替代v-model。

    方法与事件:

    Vue 提供了一个特殊变量$event ,用于访问原生DOM 事件,可以阻止事件冒泡或者阻止链接打开。

    写一个阻止冒泡的例子:

        <div @click="stopClick1('stop1',$event)">
          <div @click="stopClick2('stop2',$event)">
            <div @click="stopClick3('stop3',$event)">阻止冒泡</div>
          </div>
        </div>
     
    methods:{
        stopClick3: function(message, event){
          console.log(message);
          event.stopPropagation();  //阻止冒泡
        },
        stopClick2: function(message, event){
          console.log(message);
        },
        stopClick1: function(message, event){
          console.log(message);
        }
    }

    修饰符:
    在@绑定的事件后加小圆点“.”,再跟一个后缀来使用修饰符。
    上面的阻止冒泡事件,可以直接用户修饰符的方式写为:

    <div @click.stop="stopClick3('stop3')">阻止冒泡</div>  //不用通过$event事件再来写了

    常用的一些修饰符有:.stop、.prevent、.capture、.self、once,修饰符可以串联使用。

    <!--阻止单击事件冒泡-->
    <a @click.stop="handle"></a>
    <!--修饰符可以串联-->
    <a @click.stop.prevent="handle"></a>
    <!--添加事件侦听器时使用事件捕获模式-->
    <div @click.capture="handle"> ... </div>
    <!--只当事件在该元素本身(而不是子元素) 触发时触发回调-->
    <div @click.self="handle"> ... </div>
    <!--只触发一次,组件同样适用-->
    <div @click.once="handle"> ... </div>

    数组更新:
    当我们修改数组时, Vue 会检测到数据变化,所以用v-for 渲染的视图也会立即更新。

    • push()
    • pop()
    • shift()
    • unshit()
    • splice()
    • sort()
    • reverse()

    以上方法会改变被这些方法调用的原始数组,也有些方法不会改变原数组,它们返回的是一个新数组,在使用这些非变异的方法时,可以用新数组来替换原数组,相同的元素不会重新渲染。

    例如:

    • filter()
    • concat()
    • slice()
    app.books = app.books.filter(function(item){
      return item.name.match(/JavaScript/);
    });

    过滤与排序:

    当你不想改变原数组,想通过一个数组的副本来做过滤或排序显示时,可以使用计算属性来返回过滤或排序后的数组。

    表单与v-model

    表单控件在实际业务中较为常见,比如单选、多选、下拉选项、输入框等,用它们可以完成数据的录入、校验、提交等,上面内置指令中提到了v-model指令,用于在表单类元素上双向绑定数据,可以将输入的内容实时映射到绑定的数据上。

    备注:v-model 也有修饰符,用于控制数据同步的时机,如:使用修饰符.lazy 会转变为在change事件中同步;使用修饰符.number 可以将输入转换为Number类型;使用修饰符.trim 可以自动过滤输入的首尾空格。

    输入框:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <meta http-equiv="X-UA-Compatible" content="ie=edge">
        <title>Document</title>
    </head>
    <body>
        <div id="app">
            <input type="text" v-model="message" placeholder="输入...">
            <p>输入的内容是:{{ message }}</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    message: ''
                }
            })
        </script>
    </body>
    </html>

     在输入框输入的同时,{{ message }} 也会实时将内容渲染在视图中。

    单选按钮:

    单选按钮在单独使用时,不需要 v-model,直接使用 v-bind 绑定一个布尔值类型的值,为真时选中,为否时不选。

    <div id="app">
            <input type="radio" :checked="picked">
            <label>单选按钮</label>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    picked: true
                }
            })
        </script>

    如果是组合使用来实现互斥选择的效果,就需要 v-model 配合 value 来使用。

    <div id="app">
            <input type="radio" v-model="picked" value="html" id="html"><label for="html">HTML</label>
            <input type="radio" v-model="picked" value="js" id="js"><label for="js">JavaScript</label>
            <input type="radio" v-model="picked" value="css" id="css"><label for="css">CSS</label>
            <br>
            <p>选择的项是:{{ picked }}</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    picked: 'js'
                }
            })
        </script>

    复选框:

    复选框也是分单独使用和组合使用,不过用法稍与单选不同,复选框单独使用时也是用 v-model 来绑定一个布尔值。

       <div id="app">
            <input type="checkbox" v-model="checked" id="checked">
            <label for="checked">选择状态:{{ checked }}</label>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    checked: false
                }
            })
        </script>

    组合使用时,也是 v-model 与 value 一起,多个勾选框都绑定到同一个数组类型的数据,value的值在数组当中,就会选择这一项。

        <div id="app">
            <input type="checkbox" v-model="checked" value="html" id="html"><label for="html">HTML</label>
            <br>
            <input type="checkbox" v-model="checked" value="js" id="js"><label for="js">JavaScript</label>
            <br>
            <input type="checkbox" v-model="checked" value="css" id="css"><label for="css">CSS</label>
            <br>
            <p>选择的项是:{{ checked }}</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    checked: ['html','css']
                }
            })
        </script>

    选择列表:

    选择列表就是下拉选择器,同样也是分为单选和多选方式。

        <div id="app">
            <select v-model="selected">
                <option>HTML</option>
                <option value="js">JavaScript</option>
                <option>CSS</option>
            </select>
            <p>选择的项是:{{ selected }}</p>
    
            <select v-model="selected2" multiple>
                <option value="html">HTML</option>
                <option value="js">JavaScript</option>
                <option value="css">CSS</option>
            </select>
            <p>选择的项是:{{ selected2 }}</p>
        </div>
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    selected: 'HTML',
                    selected2: ['html','js']
                }
            })
        </script>

    Class 与 Style 绑定

    对于数据绑定,一个常见的需求是操作元素的class样式列表和它的内联样式。我们可以用v-bind绑定元素属性,表达式的结果类型可以是字符串,也可以是对象或数组,v-bind:class 指令也可以与普通的 class 属性共存。

    表达式为对象时:

    <div id='example' class="h12" :class="{'active':isActive,'error':isError}"></div>
    var vm = new Vue({
      el: '#example',
      data: {
        isActive: true,
        isError: false
      }
    })

    渲染为:

    <div id='example' class="h12 active"></div>

    以上例子普通class绑定h12样式,通过v-bind:class绑定的表达式为对象,渲染结果中h12样式永远存在,当数据isActive和isError变化时,为true的对应的class样式被添加到class列表中。

    我们也可以直接绑定数据中的一个对象,代码示例如下:

    <div id='example' class="h12" :class="container"></div>
    var vm = new Vue({
      el: '#example',
      data: {
        container:{
          'active': true,
          'error': false
        }
      }
    })

    当然除了绑定数据外,我们也可以直接绑定计算属性使用,处理更复杂的业务逻辑,不过在项目中很少用到。

    表达式为数组时:

    <div id='example' :class="[active, error]"></div>
    var vm = new Vue({
      el: '#example',
      data: {
        active: 'active',
        error: 'error',
    isError: true } })

    渲染为:

    <div id='example' class="active error"></div>

    如果想根据条件切换列表中的class,则可以用三元表达式,代码示例如下:

    <div id='example' :class="[active, isError ? error : '']"></div>

     

    绑定内联样式:

    v-bind:style的表达式可以绑定对象,也可以是数组,CSS属性名可以用驼峰命名式(camelCase)或短横分隔命名式(kebab-case),代码示例如下:

    <div id='example' :style="{'color':color,'fontSize':fontSize+'px'}">样式</div>
    var vm = new Vue({
      el: '#example',
      data: {
        color: 'orange',
        fontSize: 13
      }
    })

    渲染为:

    <div style="color: orange; font-size: 13px;">样式</div>

     通常直接绑定到一个样式对象更好,让模板更清晰,代码示例如下:

    <div id='example' :style="ddfe">样式</div>
    var vm = new Vue({
      el: '#example',
      data: {
        ddfe: {
          color: 'orange',
          fontSize: 13
        }
      }
    })

    v-bind:style 的数组语法可以将多个样式对象应用到一个元素上,代码示例如下:

    <div id='example' :style="[ddfe, ddcolor]">样式</div>

    目录导航

    参考资料

    Vue.js

  • 相关阅读:
    谷粒商城所学知识点整理总结
    谷粒商城项目介绍
    JVM 中的垃圾回收
    对象的创建和分配
    JVM 中的异常
    JVM 中的StringTable
    一个 java 文件的执行过程详解
    复制表的方法
    从 Vue parseHTML 来学习正则表达式
    Visual Studio 2022 预览版下载来了(x64位)
  • 原文地址:https://www.cnblogs.com/han1982/p/11598838.html
Copyright © 2020-2023  润新知