zoukankan      html  css  js  c++  java
  • 学习vue.js (一)

    MVVM模式

    MVVM是Model-View-ViewModel的简写,即模型-视图-视图模型。当View(视图层)变化时,会自动更新到ViewModel(视图模型),反之也一样,View和ViewModel之间通过双向绑定。

     与MVC区别,MVC是单向通信,VUE就是基于MVVM模式实现的一套框架,在VUE中Model层指的是js中的data数据,View层指的是页面视图,ViewModel是指vue实例化对象。

    Vue.js的开发模式

    Vue.js 是一套构建用户界面的渐进式框架
    当数据与DOM进行了关联,所有的东西都是响应式的,我们怎么确认呢?
    在你当前运行的窗口,打开浏览器的JavaScript控制台,并修改app.message的值,你将看到上例的值相应的更新。

    内置指令

    指令 (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。

    v-bind 特性被称为指令。指令带有前缀 v-,以表示他们是Vue提供的特殊的特性。

    我们不仅可以把数据绑定到DOM文本或特性,还可以绑定到DOM结构。此外,Vue也提供了一个强大的过渡效果系统,可以在Vue插入/更新/移除元素时自动应用过渡效果。

    v-if 条件控制语句 可控制一个元素是否显示是否隐藏。
    v-for 循环 该指令可以绑定数组的数据来渲染一个项目列表。
    v-on 指令添加一个事件监听器,通过他调用在Vue实例中定义的方法。绑定事件
    v-model 指令,它能轻松实现表单输入和应用状态之间的双向绑定。

    组件化应用构建:组件系统是vue的另一个重要的概念,因为它是一种抽象,允许我们使用小型、独立的通常可复用的组件构建大型应用。
    注册一个全局组件语法格式如下:
    Vue.compnent(tagName,options)
    tagName为组件名,options为配置选项。注册后我们可以使用以下方式来调用组件:
    <tagName></tagName>
    组件可复用,一个组件的 data 选项必须是一个函数,因为你每用一次组件,就会有一个它的新实例被创建。
    在组件中创建多个标签时,标签必须有父标签,否则不能显示
    例:
    vue.compnent('button-counter',{

    data: function () {
    return {
    count:0
    }
    },
    template: '<div><h1>标题</h1></h1><button v-on:click="count++">You clicked me {{count}} times.</button></div>'//当创建两个或两个以上的标签必须包含在父标签内
    })
    props属性:父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!
    使用 $on(eventName) 监听事件
    使用 $emit(eventName) 触发事件

    Vue实例
    创建一个Vue实例,每一个Vue应用都是通过用Vue函数创建一个Vue实例开始的:
    var vm=new Vue({
    //选项
    })
    当创建一个Vue实例时,你可以传入一个选项对象,可以在API文档中浏览完整的选项列表。https://cn.vuejs.org/v2/api/#%E9%80%89%E9%A1%B9-%E6%95%B0%E6%8D%AE vue数据选项

    数据与方法
    当一个Vue实例被创建时,它将 data 对象的所有属性加入到vue的响应式系统中,当这些属性的值发生改变时,视图(页面)将会产生"响应",即匹配更新为新的值。
    例:
    // 我们的数据对象
    var data = { a: 1 }

    // 该对象被加入到一个 Vue 实例中
    var vm = new Vue({
    data: data
    })

    // 获得这个实例上的属性
    // 返回源数据中对应的字段
    vm.a == data.a // => true

    // 设置属性也会影响到原始数据
    vm.a = 2
    data.a // => 2

    // ……反之亦然
    data.a = 3
    那么对于 b 的改动将不会触发任何视图的更新。如果你知道你晚些时候需要一个属性,但是一开始它为空或不存在,那么你需要设置一些初始值。比如:
    data: {
    vm.a // => 3
    当这些数据改变时,视图会重新渲染。值得注意的是只有当实例被创建时就已经存在于data中的属性才是响应式的。也就是说如果你添加一个新的属性,如:
    vm.b='hi'
    newTodoText: '',
    visitCount: 0,
    hideCompletedTodos: false,
    todos: [],
    error: null
    }
    这里唯一的例外是使用 Object.freeze() ,这会组织修改现有的属性,也意味着响应系统无法在追踪变化。
    例:
    var obj = {
    foo: 'bar'
    }

    Object.freeze(obj)

    var apps = new Vue({
    el: '#app',
    data: obj
    })
    <div id="app">
    <p>{{ foo }}</p>
    <!-- 这里的 `foo` 不会更新! -->
    <button v-on:click="foo = 'baz'">Change it</button>
    </div>

    除了数据属性,vue实例还暴露了一些有用的实例属性与方法。它们都有前缀 $ ,以便与用户定义的属性区分开来。

    模板语法
    数据绑定最常见的形式j就是使用"Mustache"语法(双大括号)的文本插值:
    <span>Message: {{ msg }}</span>
    双大括号标签将会被替代为对应数据对象上 msg 属性的值。无论何时,绑定的数据对象上 msg 属性发生了改变,插值处的内容都会更新。

    特性
    Mustache语法不能作用在HTML特性上,遇到这种情况 应该使用 v-bind 指令: https://cn.vuejs.org/v2/api/#v-bind
    例:<div v-bind:id="dynamicId"></div>

    对于布尔特性(它们只要存在就意味着值为 true) ,v-bind 工作起来略有不同,
    例:<button v-bind:disabled="isButtonDisabled">Button</button>
    如果 isButtonDisabled 的值是null,undefined,或 false,则disabled 特性甚至不会被包含在渲染出来的 <button> 元素中。

    使用 JavaScript表达式
    例:
    {{ number + 1 }}

    {{ ok ? 'YES' : 'NO' }}

    {{ message.split('').reverse().join('') }}

    <div v-bind:id="'list-' + id"></div>
    这些表达式会在所属 Vue 实例的数据作用域下作为 JavaScript 被解析。有个限制就是,每个绑定都只能包含单个表达式,所以下面的例子都不会生效。

    <!-- 这是语句,不是表达式 -->
    {{ var a = 1 }}

    <!-- 流控制也不会生效,请使用三元表达式 -->
    {{ if (ok) { return message } }}
    注:模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。

    指令
    指令是带有 v- 前缀的特殊特性,指令的指责是,当表达式的值改变时,将其产生的连带影响,响应式的作用于 DOM 。
    例:
    <p v-if="seen">现在你看到我了</p>
    这里,v-if 指令将根据表达式 seen 的值的真假来插入/移除 <p> 元素。

    参数
    一些指令能够接收一个“参数”,在指令名称之后以冒号表示。例如,v-bind 指令可以用于响应式地更新 HTML 特性:

    <a v-bind:href="url">...</a>
    在这里 href 是参数,告知 v-bind 指令将该元素的 href 特性与表达式 url 的值绑定。

    另一个例子是 v-on 指令,它用于监听 DOM 事件:

    <a v-on:click="doSomething">...</a>
    在这里参数是监听的事件名。

    动态参数
    2.6.0 新增

    从 2.6.0 开始,可以用方括号括起来的 JavaScript 表达式作为一个指令的参数:

    <a v-bind:[attributeName]="url"> ... </a>
    这里的 attributeName 会被作为一个 JavaScript 表达式进行动态求值,求得的值将会作为最终的参数来使用。
    例如,如果你的 Vue 实例有一个 data 属性 attributeName,其值为 "href",那么这个绑定将等价于 v-bind:href。

    修饰符
    修饰符 (modifier) 是以半角句号 . 指明的特殊后缀,用于指出一个指令应该以特殊方式绑定。例如,.prevent 修饰符告诉 v-on 指令对于触发的事件调用 event.preventDefault():

    <form v-on:submit.prevent="onSubmit">...</form>

    缩写
    v-bind缩写
    完整语法:<a v-bind:href="url"></a>
    缩写:<a :href="url"></a>

    v-on缩写
    完整语法:<a v-on:click="doSomething"></a>
    缩写:<a @click="doSomething"></a>

    计算属性
    模板内的表达式非常便利,但是设计它的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。
    例如:
    <div id="example">
    {{ message.split('').reverse().join('') }}
    </div>
    在这个地方,模板不再是简单的声明逻辑。你必须看一段时间才能意识到,这里是想要显示变量 message 的翻转字符串。当你想要在模板中多次引用此处的翻转字符串时,就会更加难以处理。
    所以,对于任何复杂逻辑,你都应当使用计算属性。
    例:
    <div id="example">
    <p>Original message: "{{ message }}"</p>
    <p>Computed reversed message: "{{ reversedMessage }}"</p>
    </div>
    var vm = new Vue({
    el: '#example',
    data: {
    message: 'Hello'
    },
    computed: {
    // 计算属性的 getter
    reversedMessage: function () {
    // `this` 指向 vm 实例
    return this.message.split('').reverse().join('')
    }
    }
    })
    结果:

    Original message: "Hello"

    Computed reversed message: "olleH"

    这里我们声明了一个计算属性 reversedMessage。我们提供的函数将用作属性 vm.reversedMessage 的 getter 函数:
    console.log(vm.reversedMessage) // => 'olleH'
    vm.message = 'Goodbye'
    console.log(vm.reversedMessage) // => 'eybdooG'
    你可以打开浏览器的控制台,自行修改例子中的 vm。vm.reversedMessage 的值始终取决于 vm.message 的值。

    你可以像绑定普通属性一样在模板中绑定计算属性。Vue 知道 vm.reversedMessage 依赖于 vm.message,因此当 vm.message 发生改变时,所有依赖 vm.reversedMessage 的绑定也会更新。
    而且最妙的是我们已经以声明的方式创建了这种依赖关系:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解。

    计算属性 VS 方法
    计算属性 VS 侦听属性
    计算属性的setter
    侦听器
    请看官网详解:https://cn.vuejs.org/v2/guide/computed.html#%E5%9F%BA%E7%A1%80%E4%BE%8B%E5%AD%90

    v-show指令 带有v-show]指令的元素始终会被渲染并保留在BOM中。v-show只是简单的切换元素的CSS属性display

    事件处理
    v-on指令 用于绑定事件
    事件修饰符 通过由 . 表示的指令后缀来调用修饰符
    例:
    <a v-on:click.stop="doThis"></a> //阻止单机事件冒泡
    <from v-on:submit.prevent="onSubmit"></from> // 提交事件不再重载页面
    <a v-on:click.stop.prevent=""></a> //只有修饰符
    <div v-on:click.capture="doThis"></div> //添加事件侦听器时使用事件捕获模式
    <div v-on:click.self="doThat"></div> //只当事件在该元素本身(而不是子元素)触发时触发回调

    <div v-on:click.once="doThis"></div> //click事件只能点击一次,2.1.4版本新增

    按键修饰符
    vue为常用的的按键提供了别名:
    <input v-on:keyup.enter="submit" /> //只有keyup是enter时调用submit方法
    缩写:<input @keyup.enter="submit" />
    全部按键别名:.enter .tab .delete (捕获"删除"和"退格"键) .esc .space .up .down .left .right .ctrl .alt .shift .meta

    表单输入绑定
    v-model 指令在表单<input>,<textarea></textarea>,<select></select> 元素上创建双向数据绑定。它会根据控件类型自动选取正确的方法来更新元素,
    注:v-model 会忽略所有表单元素的 value,checked,selected,特性的初始值而总是将vue实例的数据作为数据来源。你应该通过JavaScript在组件的data选项中声明初始值。



  • 相关阅读:
    20 行代码:Serverless 架构下用 Python 轻松搞定图像分类
    Serverless 的内存配置与超时时间
    Serverless 架构与事件规范
    如何用 Serverless 优雅地给网站图片加水印
    修改rpmbuild构建目录的位置
    rpmbuild之构建目录结构解析
    全量编译与增量编译
    c堆排序的实现
    c优先队列的实现
    c栈的实现
  • 原文地址:https://www.cnblogs.com/codehistory/p/11610879.html
Copyright © 2011-2022 走看看