zoukankan      html  css  js  c++  java
  • vue.api

    样式绑定

    代码:
    <div v-bind:class="{ active: isActive }"></div>
    解释:
    当 isActive为 true时, div就会具有了active样式类,如果 isActive为false,那么div就去掉active样式类。

    混合普通的HTML标签样式类及绑定样式对象

    v-bind:class 指令可以与普通的 class 属性共存

    <div id="app">
      <div class="static"
         v-bind:class="{ active: isActive, 'text-danger': hasError }">
      </div>
    </div>
    <script>
      var app = new Vue({         
        el: '#app',               
        data: {                   // data: 是Vue对象中绑定的数据
          isActive: true,
          hasError: false
        }
      });
    </script>

    绑定data中的样式对象

    <div id="app">
      <div class="static"
         v-bind:class="classObject">
      </div>
    </div>
    <script>
      var app = new Vue({         
        el: '#app',               
        data: {
          classObject: {
            active: true,
            'text-danger': false
          }
        }
      });
    </script>
    // 结果
    <div id="app"> <div class="static active"> </div> </div>

    绑定样式数组

    <div v-bind:class="[activeClass, errorClass]">
    
    data: {
      activeClass: 'active',
      errorClass: 'text-danger'
    }

    计算属性

    在做数据的绑定的时候,数据要进行处理之后才能展示到html页面上,虽然vue提供了非常好的表达式绑定的方法,但是只能应对低强度的需求。比如: 把一个日期按照规定格式进行输出,可能就需要我们对日期对象做一些格式化的出来,表达式可能就捉襟见肘了。

    Vue对象提供的computed属性,可以让我们开发者在里面可以放置一些方法,协助我们绑定数据操作,这些方法可以跟data中的属性一样用,注意这些方法用的时候不要加()

    <!DOCTYPE html> 
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Vue入门之htmlraw</title>
      <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
      <div id="app">
        <table>
          <tr>
            <!-- computed里面的函数可以直接当成data里面的属性用,非常方便,注意没有括号!!!-->
            <td>生日</td><td>{{ getBirthday }}</td>
          </tr>
          <tr>
            <td>年龄</td><td>{{ age }}</td>
          </tr>      
          <tr>
            <td>地址</td><td>{{ address }}</td>
          </tr>
        </table>
      </div>
      <script>
        var app = new Vue({         
          el: '#app',               
          data: {                   
            birthday: 914228510514,     // 这是一个日期对象的值:1998年11月1日
            age: 19,
            address: '北京昌平区龙泽飞龙'
          },
          computed: {
            // 把日期换成 常见规格格式的字符串。
            getBirthday: function () {
              var m = new Date(this.birthday);
              return m.getFullYear() + '年' + m.getMonth() +'月'+ m.getDay()+'日';
            }
          }
        });
      </script>
    </body>
    </html>

    绑定的数据过滤器

    {{ message | capitalize }}
    <!-- in mustaches -->
    {{ message | capitalize }}
    <!-- in v-bind -->
    <div v-bind:id="rawId | formatId"></div>
    Vue 2.x 中,过滤器只能在 mustache 绑定和 v-bind 表达式(从 2.1.0 开始支持)中使用,因为过滤器设计目的就是用于文本转换。为了在其他指令中实现更复杂的数据变换,你应该使用计算属性。
    
    过滤器函数总接受表达式的值作为第一个参数。
    new Vue({
      // ...
      filters: {
        capitalize: function (value) {
          if (!value) return ''
          value = value.toString()
          return value.charAt(0).toUpperCase() + value.slice(1)
        }
      }
    })
    过滤器可以串联:
    {{ message | filterA | filterB }}
    过滤器是 JavaScript 函数,因此可以接受参数:
    {{ message | filterA('arg1', arg2) }}
    这里,字符串 'arg1' 将传给过滤器作为第二个参数, arg2 表达式的值将被求值然后传给过滤器作为第三个参数。

    双向数据绑定

    上面的例子我们大多讲的是单向的 js对象向 HTML数据进行绑定,那HTML怎样向js进行反馈数据呢? HTML中只有表达能接受用户的输入,最简单的演示双向绑定的就是文本框了。

    Vue提供了一个新的指令:v-model进行双向数据的绑定,注意不是v-bind。

    你改变input文本框的内容的时候,p标签中的内容会跟着进行改变,哇是不是很神奇呢...

    Template循环渲染多标签

    上面的例子,我们演示的是 每次循环输出一个tr标签。如果我们希望每次循环生成两个tr标签呢?如果还有生成其他的标签呢?

    Vue给我们提供了template标签,供我们用于v-for循环中进行处理。

    上代码喽:

    <ul>
      <!-- 通过template标签,可以一次循环,输出两个li标签 -->
      <template v-for="item in items">
        <li>{{ item.msg }}</li>
        <li class="divider"></li>
      </template>
    </ul>

    关于v-for对应的数组的更新

    由于Vue的机制就是检测数据的变化,自动跟新HTML。数组的变化,Vue之检测部分函数,检测的函数执行时才会触发视图更新。这些方法如下:

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

    Vue事件处理

     Vue对象中可以添加methods属性,开发者可以把事件处理函数的逻辑放到methods中

    官网上写的非常好,这块就直接用管网的吧。在事件处理程序中调用 event.preventDefault() 或 event.stopPropagation() 是非常常见的需求。尽管我们可以在 methods 中轻松实现这点,但更好的方式是:methods 只有纯粹的数据逻辑,而不是去处理 DOM 事件细节。 为了解决这个问题, Vue.js 为 v-on 提供了 事件修饰符。通过由点(.)表示的指令后缀来调用修饰符。

    • .stop
    • .prevent
    • .capture
    • .self
    • .once
    • <!-- 阻止单击事件冒泡 -->
      <a v-on:click.stop="doThis"></a>
      <!-- 提交事件不再重载页面 -->
      <form v-on:submit.prevent="onSubmit"></form>
      <!-- 修饰符可以串联  -->
      <a v-on:click.stop.prevent="doThat"></a>
      <!-- 只有修饰符 -->
      <form v-on:submit.prevent></form>
      <!-- 添加事件侦听器时使用事件捕获模式 -->
      <div v-on:click.capture="doThis">...</div>
      <!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
      <div v-on:click.self="doThat">...</div>
      <!-- the click event will be triggered at most once -->
      <a v-on:click.once="doThis"></a>

    按键修饰符

    在监听键盘事件时,我们经常需要监测常见的键值。 Vue 允许为 v-on 在监听键盘事件时添加按键修饰符:

    <!-- 只有在 keyCode 是 13 时调用 vm.submit() -->
    <input v-on:keyup.13="submit">
    记住所有的 keyCode 比较困难,所以 Vue 为最常用的按键提供了别名:
    <!-- 同上 -->
    <input v-on:keyup.enter="submit">
    <!-- 缩写语法 -->
    <input @keyup.enter="submit">

    全部的按键别名:

    • .enter
    • .tab
    • .delete (捕获 “删除” 和 “退格” 键)
    • .esc
    • .space
    • .up
    • .down
    • .left
    • .right
    • .ctrl
    • .alt
    • .shift
    • .meta
    • 事件绑定总结

      Vue为了方便大家进行开发,提供了事件的相关的封装,可以让我们方便我们用Vue对事件进行开发,尤其是v-on指令的非常方便的跟Vue对象中methods进行配合进行复杂的事件处理,非常方便。另外事件的事件修饰符和按键修饰符也可以让Vue事件这块锦上添花。

      

    Vue实例详解与生命周期

    Vue的实例是Vue框架的入口,其实也就是前端的ViewModel,它包含了页面中的业务逻辑处理、数据模型等,当然它也有自己的一系列的生命周期的事件钩子,辅助我们进行对整个Vue实例生成、编译、挂着、销毁等过程进行js控制。

    Vue实例的computed

    介绍

    Vue的计算属性(computed)的属性会自动混入Vue的实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。这就很强大了,再计算属性中定义的函数里面可以直接使用指向了vue实例的this,异常方便的啊。

    var vm = new Vue({
    data: { a: 1 },
    computed: {
      // 仅读取,值只须为函数
      aDouble: function () {
        return this.a * 2
      },
      // 读取和设置
      aPlus: {
        get: function () {
          return this.a + 1
        },
        set: function (v) {
          this.a = v - 1
        }
      }
    }
    })
    vm.aPlus   // -> 2
    vm.aPlus = 3
    vm.a       // -> 2
    vm.aDouble // -> 4

    methods

    • 类型: { [key: string]: Function }

    • 详细:

    methods 将被混入到 Vue 实例中。可以直接通过 VM 实例访问这些方法,或者在指令表达式中使用。方法中的 this 自动绑定为 Vue 实例。

    注意,不应该使用箭头函数来定义 method 函数 (例如 plus: () => this.a++)。理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.a 将是 undefined。

    var vm = new Vue({
      data: { a: 1 },
      methods: {
        plus: function () {
          this.a++
        }
      }
    })
    vm.plus()
    vm.a // 2

    watch

    • 类型

    { [key: string]: string | Function | Object }

    • 详细:

    一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。Vue 实例将会在实例化时调用 $watch(),遍历 watch 对象的每一个属性。

    var vm = new Vue({
      data: {
        a: 1,
        b: 2,
        c: 3
      },
      watch: {
        // 监控a变量变化的时候,自动执行此函数
        a: function (val, oldVal) {
          console.log('new: %s, old: %s', val, oldVal)
        },
        // 深度 watcher
        c: {
          handler: function (val, oldVal) { /* ... */ },
          deep: true
        }
      }
    })
    vm.a = 2 // -> new: 2, old: 1
    //注意,不应该使用箭头函数来定义 watcher 函数 
    (例如 searchQuery: newValue => this.updateAutocomplete(newValue))。
    理由是箭头函数绑定了父级作用域的上下文,所以 this 将不会按照期望指向 Vue 实例,this.updateAutocomplete 将是 undefined。

    设置el的详解

    • 类型

    string | HTMLElement

    限制: 只在由 new 创建的实例中遵守。

    • 详细:

    提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标,也就是说Vue绑定数据到哪里去找。可以是CSS 选择器,也可以是一个 HTMLElement实例

    Vue实例的生命周期 :

    Vue实例的全局配置

    Vue的全局API

    Vue的全局API提供大量的功能,我这里就给大家罗列几个常用的结果,其他的还是参考官网.

    5.4.1. Vue.nextTick

    语法: Vue.nextTick( [callback, context] )

    // 修改数据
    vm.msg = 'Hello'
    // DOM 还没有更新
    Vue.nextTick(function () {
      // DOM 更新了
    })

     Vue.compile

    • 语法:

    Vue.compile( template )

    • 参数:

    {string} template

    • 用法:
    • //在render函数中编译模板字符串。只在独立构建时有效
      var res = Vue.compile('<div><span>{{ msg }}</span></div>')
      new Vue({
        data: {
          msg: 'hello'
        },
        render: res.render,
        staticRenderFns: res.staticRenderFns
      })

      全局扩展方法Vue.extend

    • Vue提供了一个全局的API,Vue.extend可以帮助我们对Vue实例进行扩展,扩展完了之后,就可以用此扩展对象创建新的Vue实例了。 类似于继承的方式。
    • <div id="mount-point"></div>
      <script>
      // 创建构造器
      var Profile = Vue.extend({
        // 新的对象的模板,所有子实例都会拥有此模板
        template: '<p>{{firstName}} {{lastName}} aka {{alias}}</p>',
        data: function () {   // 创建的Vue实例时,data可以是Object 也可以是Function,但是在扩展
          return {            // 的时候,data必须是一个函数,而且要返回值奥。
            firstName: 'Walter',
            lastName: 'White',
            alias: 'Heisenberg'
          }
        }
      })
      </script>
      
      
      // 创建 Profile 实例,并挂载到一个元素上。
      new Profile().$mount('#mount-point')
      // .$mount() 方法跟设置 el属性效果是一致的。
      
      结果如下:
      
      <p>Walter White aka Heisenberg</p>

      创建组件和注册组件

    • Vue提供了一个全局注册组件的方法:Vue.component

      

    // 注册一个组件
    Vue.component('my-component', {
      // 模板选项设置当前组件,最终输出的html模板。注意:有且只有一个根元素。
      template: '<div>A custom component!</div>'
    })
    // 创建根实例
    new Vue({
      el: '#example'
    })

    局部注册组件

    全局注册组件就是使用全局API Vue.componet(id, {....})就行了,当然我们有时候需要注册一个局部模块的自己用的组件。那么就可以用下面的方式了。

    var Child = {
      template: '<div>A custom component!</div>'
    }
    new Vue({
      // ...
      components: {
        // <my-component> 将只在父模板可用
        'my-component': Child
      }
    })

    组件的slot

    使用组件的时候,经常需要在父组件中为子组件中插入一些标签等。当然其实可以通过属性等操作,但是比较麻烦,直接写标签还是方便很多。 那么Vue提供了slot协助子组件对父容器写入的标签进行管理。

    当父容器写了额外的内容时, 如果子组件恰好有一个slot标签,那边子容器的slot标签会被父容器写入的内容替换掉

    <!DOCTYPE html> 
    <<!DOCTYPE html> 
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <title>Vue入门之extend全局方法</title>
      <script src="https://unpkg.com/vue/dist/vue.js"></script>
    </head>
    <body>
      <div id="app">
        <!--父容器输入标签-->
        <my-slot>
          <h3>这里是父容器写入的</h3>
        </my-slot>
    
        <!--父容器绑定数据到子容器的slot,这里的作用域是父容器的啊。-->
        <my-slot>{{ email }}</my-slot>
    
        <!--父容器什么都不传内容-->
        <my-slot></my-slot>
      </div>
      <script>
        // 反引号:可以定义多行字符串。
        var temp = `
          <div>
            <h1>这里是子组件</h1>
            <hr>
            <slot>slot标签会被父容器写的额外的内容替换掉,如果父容器没有写入任何东西,此标签将保留!</slot>
          </div>
        `;
        Vue.component('MySlot', {          // 如果定义的组件为MySlot,那么用组件的时候:<my-slot></my-slot>
          template: temp,   
        });                    
        // 初始化一个Vue实例
        var app = new Vue({         
          el: '#app',               
          data: {                   
           email: 'flydragon@gmail.com'
          }
        });
      </script>
    </body>
    </html>
    <div id="app">
      <div>
        <h1>这里是子组件</h1>
        <hr>
        <h3>这里是父容器写入的</h3>
      </div>
    
      <div>
        <h1>这里是子组件</h1>
        <hr> flydragon@gmail.com
      </div>
    
      <div>
        <h1>这里是子组件</h1>
        <hr> slot标签会被父容器写的额外的内容替换掉,如果父容器没有写入任何东西,此标签将删除!
      </div>
    </div>
    若有恒,何须三更睡五更起;最无益,莫过于一日曝十日寒
  • 相关阅读:
    #1045
    PHP程序员的技术成长规划
    403 Forbidden
    读《暗时间》的思考
    常用判断重复记录的SQL语句
    PHP中生产不重复随机数的方法
    echo 1+2+"3+4+5“输出的结果是6
    GET vs. POST
    详解PHP中的过滤器(Filter)
    Session变量在PHP中的使用
  • 原文地址:https://www.cnblogs.com/21haoxingxiu/p/7277244.html
Copyright © 2011-2022 走看看