vue

 

 

 

 

 

1.Vue.js 是什么?

网址:https://vuejs.org/

Vue.js(读音 /vjuː/,类似于 view 的读音)是一套构建用户界面(user interface)的渐进式框架。与其他重量级框架不同的是,Vue 从根本上采用最小成本、渐进增量(incrementally adoptable)的设计。Vue 的核心库只专注于视图层,并且很容易与其他第三方库或现有项目集成。另一方面,当与单文件组件 Vue 生态系统支持的库结合使用时,Vue 也完全能够为复杂的单页应用程序提供有力驱动。

声明式渲染

Vue.js 的核心是,可以采用简洁的模板语法来声明式的将数据渲染为 DOM:

<div id="app">
{{ message }}
</div>
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
})
Hello Vue!
 
 
2.vue的7/8/7
>>1.7个属性

el:template render
data:view ->property
mehtods: views-> events
template: string template
render: createElement
computed:
watch:function(new,old){} hook newold-oldnew

el

  • 类型:string | HTMLElement

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

  • 详细:

    提供一个在页面上已存在的 DOM 元素作为 Vue 实例的挂载目标。可以是 CSS 选择器,也可以是一个 HTMLElement 实例。

    在实例挂载之后, 元素可以用 vm.$el 访问。

    如果这个选项在实例化时有作用,实例将立即进入编译过程,否则,需要显式调用 vm.$mount() 手动开启编译。

    提供的元素只能作为挂载点。不同于 Vue 1.x,所有的挂载元素会被 Vue 生成的 DOM 替换。因此不推荐挂载root实例到 <html> 或者 <body> 上。

    如果 render 函数和 template 属性都不存在,挂载 DOM 元素的 HTML 会被提取出来用作模板,此时,必须使用 Runtime + Compiler 构建的 Vue 库。

data

  • 类型:Object | Function

  • 限制:组件的定义只接受 function

  • 详细:

    Vue 实例的数据对象。Vue 将会递归将 data 的属性转换为 getter/setter,从而让 data 的属性能够响应数据变化。对象必须是纯粹的对象(含有零个或多个的key/value对):浏览器 API 创建的原生对象,原型上的属性会被忽略。大概来说,data 应该只能是数据 - 不推荐观察拥有状态行为的对象。

    一旦观察过,不需要再次在数据对象上添加响应式属性。因此推荐在创建实例之前,就声明所有的根级响应式属性。

    实例创建之后,可以通过 vm.$data 访问原始数据对象。Vue 实例也代理了 data 对象上所有的属性,因此访问 vm.a 等价于访问 vm.$data.a

     _ 或 $ 开头的属性 不会 被 Vue 实例代理,因为它们可能和 Vue 内置的属性、 API 方法冲突。你可以使用例如 vm.$data._property 的方式访问这些属性。

    在定义一个组件时,data 必须声明为一个返回初始数据对象的函数,因为可能会使用此函数创建多个实例。如果 data 是一个普通对象,则所有创建出来的实例将共享引用同一个数据对象!通过提供 data 函数,每次创建一个新实例后,我们能够调用 data函数,从而返回初始数据的一个全新的 data 对象副本。

    如果需要,可以通过将 vm.$data 传入 JSON.parse(JSON.stringify(...)) 得到深拷贝的原始数据对象。

  • 示例:

    var data = { a: 1 }

    // 直接创建一个实例
    var vm = new Vue({
    data: data
    })
    vm.a // => 1
    vm.$data === data // => true

    // Vue.extend() 中 data 必须是函数
    var Component = Vue.extend({
    data: function () {
    return { a: 1 }
    }
    })

    注意,如果你对 data 属性使用箭头函数,this 将不会指向组件实例,但是你仍然可以通过函数返回的第一个参数,来访问组件实例:

    data: vm => ({ a: vm.myProp })

template

  • 类型:string

  • 详细:

    一个字符串模板作为 Vue 实例的标识使用。模板将会 替换 挂载的元素。挂载元素的内容都将被忽略,除非模板的内容有分发 slot。

    如果值以 # 开始,则它用作选项符,将使用匹配元素的 innerHTML 作为模板。常用的技巧是用 <script type="x-template"> 包含模板。

    出于安全考虑,你应该只使用你信任的 Vue 模板。避免使用其他人生成的内容作为你的模板。

    如果 Vue 选项中包含 render 函数,template 选项将被忽略。

  • 参考:

render

  • 类型:(createElement: () => VNode) => VNode

  • 详细:

    字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。render 函数接收一个 createElement 方法作为第一个参数用来创建 VNode

    如果组件是一个函数组件,render 函数还会接收一个额外的 context 参数,为没有实例的函数组件提供上下文信息。

    Vue 选项中的 render 函数若存在,则 Vue 构造函数不会从 template 选项或通过 el 选项指定的挂载元素中提取出的 HTML 模板编译 render 函数。

  • computed

    • 类型:{ [key: string]: Function | { get: Function, set: Function } }

    • 详细:

      计算属性将被混入到 Vue 实例中。所有 getter 和 setter 的 this 上下文自动地绑定为 Vue 实例。

      注意,如果你对 data 属性使用箭头函数,this 将不会指向组件实例,但是你仍然可以通过函数返回的第一个参数,来访问组件实例:

      computed: {
      aDouble: vm => vm.a * 2
      }

      计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。注意,如果实例范畴之外的依赖 (比如非响应式的 not reactive) 是不会触发计算属性更新的。

    • 示例:

      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 | Array}

    • 详细:

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

    • 示例:

      var vm = new Vue({
      data: {
      a: 1,
      b: 2,
      c: 3,
      d: 4,
      e: {
      f: {
      g: 5
      }
      }
      },
      watch: {
      a: function (val, oldVal) {
      console.log('new: %s, old: %s', val, oldVal)
      },
      // 字符串方法名
      b: 'someMethod',
      // 深度 watcher
      c: {
      handler: function (val, oldVal) { /* ... */ },
      deep: true
      },
      // 回调函数会将在观察(data observer)开始后立即被调用
      d: {
      handler: function (val, oldVal) { /* ... */ },
      immediate: true
      },
      e: [
      function handle1 (val, oldVal) { /* ... */ },
      function handle2 (val, oldVal) { /* ... */ }
      ],
      // watch vm.e.f's value: {g: 5}
      'e.f': function (val, oldVal) { /* ... */ }
      }
      })
      vm.a = 2 // => new: 2, old: 1

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

8个hook函数
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
boforeDestroy
destroyed
 
 
 

2.2、钩子函数的执行

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <script type="text/javascript" src="https://cdn.jsdelivr.net/vue/2.1.3/vue.js"></script>
</head>
<body>
<div id="app">
     <p>{{ message }}</p>
</div>
<script type="text/javascript">
    
  var app = new Vue({
      el: '#app',
      data: {
          message : "xuxiao is boy" 
      },
       beforeCreate: function () {
                console.group('beforeCreate 创建前状态===============》');
               console.log("%c%s", "color:red" , "el     : " + this.$el); //undefined
               console.log("%c%s", "color:red","data   : " + this.$data); //undefined 
               console.log("%c%s", "color:red","message: " + this.message)  
        },
        created: function () {
            console.group('created 创建完毕状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //undefined
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化 
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化
        },
        beforeMount: function () {
            console.group('beforeMount 挂载前状态===============》');
            console.log("%c%s", "color:red","el     : " + (this.$el)); //已被初始化
            console.log(this.$el);
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化  
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化  
        },
        mounted: function () {
            console.group('mounted 挂载结束状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el); //已被初始化
            console.log(this.$el);    
               console.log("%c%s", "color:red","data   : " + this.$data); //已被初始化
               console.log("%c%s", "color:red","message: " + this.message); //已被初始化 
        },
        beforeUpdate: function () {
            console.group('beforeUpdate 更新前状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);   
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        updated: function () {
            console.group('updated 更新完成状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el); 
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        beforeDestroy: function () {
            console.group('beforeDestroy 销毁前状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);    
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message); 
        },
        destroyed: function () {
            console.group('destroyed 销毁完成状态===============》');
            console.log("%c%s", "color:red","el     : " + this.$el);
            console.log(this.$el);  
               console.log("%c%s", "color:red","data   : " + this.$data); 
               console.log("%c%s", "color:red","message: " + this.message)
        }
    })
</script>
</body>
</html>
3.指令
v-for

列表渲染

使用 v-for 遍历数组生成元素

我们可以使用 v-for 指令,将一个数组渲染为列表项。v-for 指令需要限定格式为 item in items 的特殊语法,其中,items 是原始数据数组(source data array),而 item是数组中每个迭代元素的指代别名(alias):

<ul id="example-1">
<li v-for="item in items">
{{ item.message }}
</li>
</ul>
var example1 = new Vue({
el: '#example-1',
data: {
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})

结果:

  • Foo
  • Bar

 v-for 代码块中,我们可以完全地访问父级作用域下的属性。v-for 还支持可选的第二个参数,作为当前项的索引。

<ul id="example-2">
<li v-for="(item, index) in items">
{{ parentMessage }} - {{ index }} - {{ item.message }}
</li>
</ul>
var example2 = new Vue({
el: '#example-2',
data: {
parentMessage: 'Parent',
items: [
{ message: 'Foo' },
{ message: 'Bar' }
]
}
})

结果:

  • Parent - 0 - Foo
  • Parent - 1 - Bar

你还可以不使用 in,而是使用 of 作为分隔符,因为它更加接近 JavaScript 迭代器语法:

<div v-for="item of items"></div>

使用 v-for 遍历对象

也可以使用 v-for 来遍历对象的属性。

<ul id="v-for-object" class="demo">
<li v-for="value in object">
{{ value }}
</li>
</ul>
new Vue({
el: '#v-for-object',
data: {
object: {
firstName: 'John',
lastName: 'Doe',
age: 30
}
}
})

结果:

  • John
  • Doe
  • 30

还可以提供第二个参数,作为对象的键名(key):

<div v-for="(value, key) in object">
{{ key }}: {{ value }}
</div>
firstName: John
lastName: Doe
age: 30

然后第三个参数作为索引(index):

<div v-for="(value, key, index) in object">
{{ index }}. {{ key }}: {{ value }}
</div>
0. firstName: John
1. lastName: Doe
2. age: 30

v-text

  • 期望类型:string

  • 详细:

    更新元素的 textContent。如果要更新部分的 textContent ,需要使用 {{ Mustache }} 插值。

  • 示例:

    <span v-text="msg"></span>
    <!-- 和下面的一样 -->
    <span>{{msg}}</span>

v-model

  • 期望类型:随表单控件类型不同而不同。

  • 限制:

    • <input>
    • <select>
    • <textarea>
    • components
  • 修饰符:

    • .lazy - 取代 input 监听 change 事件
    • .number - 输入字符串转为数字
    • .trim - 输入首尾空格过滤
  • 用法:

    在表单控件或者组件上创建双向绑定。细节请看下面链接的教程。


v-html

  • 期望类型:string

  • 详细:

    更新元素的 innerHTML 。注意:内容按普通 HTML 插入 - 不会作为 Vue 模板进行编译 。如果试图使用 v-html 组合模板,可以重新考虑是否通过使用组件来替代。

    在网站上动态渲染任意 HTML 是非常危险的,因为容易导致 XSS 攻击。只在可信内容上使用 v-html,永不用在用户提交的内容上。

     单文件组件 中,scoped 样式不会应用在 v-html 内部,因为这些 HTML 没有被 Vue 模板编译器处理过。如果你希望针对 v-html 中的内容设置带作用域的 CSS,作为替代你可以使用 CSS 模块,或者使用一个额外的全局 <style>元素,手动设置类似 BEM 的作用域策略。

  • 示例:

    <div v-html="html"></div>

v-on

  • 缩写:@

  • 期望类型:Function | Inline Statement | Object

  • 参数:event

  • 修饰符:

    • .stop - 调用 event.stopPropagation()
    • .prevent - 调用 event.preventDefault()
    • .capture - 添加事件侦听器时使用 capture 模式。
    • .self - 只当事件是从侦听器绑定的元素本身触发时才触发回调。
    • .{keyCode | keyAlias} - 只当事件是从特定键触发时才触发回调。
    • .native - 监听组件根元素的原生事件。
    • .once - 只触发一次回调。
    • .left - (2.2.0) 只当点击鼠标左键时触发。
    • .right - (2.2.0) 只当点击鼠标右键时触发。
    • .middle - (2.2.0) 只当点击鼠标中键时触发。
    • .passive - (2.3.0) 以 { passive: true } 模式添加侦听器
  • 用法:

    绑定事件监听器。事件类型由参数指定。表达式可以是一个方法的名字或一个内联语句,如果没有修饰符也可以省略。

    用在普通元素上时,只能监听 原生 DOM 事件。用在自定义元素组件上时,也可以监听子组件触发的自定义事件。

    在监听原生 DOM 事件时,方法以事件为唯一的参数。如果使用内联语句,语句可以访问一个 $event 属性: v-on:click="handle('ok', $event)"

    从 2.4.0+ 开始,v-on 同样支持不带参数绑定一个事件/监听器键值对的对象。注意,当使用对象语法时,不支持任何修饰符。

  • 示例:

    <!-- 方法处理器 -->
    <button v-on:click="doThis"></button>

    <!-- 内联语句 -->
    <button v-on:click="doThat('hello', $event)"></button>

    <!-- 缩写 -->
    <button @click="doThis"></button>

    <!-- 停止冒泡 -->
    <button @click.stop="doThis"></button>

    <!-- 阻止默认行为 -->
    <button @click.prevent="doThis"></button>

    <!-- 阻止默认行为,没有表达式 -->
    <form @submit.prevent></form>

    <!-- 串联修饰符 -->
    <button @click.stop.prevent="doThis"></button>

    <!-- 键修饰符,键别名 -->
    <input @keyup.enter="onEnter">

    <!-- 键修饰符,键代码 -->
    <input @keyup.13="onEnter">

    <!-- 点击回调只会触发一次 -->
    <button v-on:click.once="doThis"></button>

    <!-- 对象语法(2.4.0+) -->
    <button v-on="{ mousedown: doThis, mouseup: doThat }"></button>

    在子组件上监听自定义事件(当子组件触发 “my-event” 时将调用事件处理器):

    <my-component @my-event="handleThis"></my-component>

    <!-- 内联语句 -->
    <my-component @my-event="handleThis(123, $event)"></my-component>

    <!-- 组件中的原生事件 -->
    <my-component @click.native="onClick"></my-component>

v-bind

  • 缩写::

  • 期望类型:any (with argument) | Object (without argument)

  • 参数:attrOrProp (optional)

  • 修饰符:

    • .prop - 被用于绑定 DOM 属性(有什么不同?)。如果标签是一个组件,那么 .prop 将在组件的 $el 上设置属性。
    • .camel - (2.1.0+) transform the kebab-case attribute name into camelCase.
    • .sync - (2.3.0+) 语法糖,会扩展成一个更新父组件绑定值的 v-on 侦听器。
  • 用法:

    动态地绑定一个或多个特性,或一个组件 prop 到表达式。

    在绑定 class 或 style 特性时,支持其它类型的值,如数组或对象。可以通过下面的教程链接查看详情。

    在绑定 prop 时,prop 必须在子组件中声明。可以用修饰符指定不同的绑定类型。

    没有参数时,可以绑定到一个包含键值对的对象。注意此时 class 和 style 绑定不支持数组和对象。

  • 示例:

    <!-- 绑定一个属性 -->
    <img v-bind:src="imageSrc">

    <!-- 缩写 -->
    <img :src="imageSrc">

    <!-- 内联字符串拼接 -->
    <img :src="'/path/to/images/' + fileName">

    <!-- class 绑定 -->
    <div :class="{ red: isRed }"></div>
    <div :class="[classA, classB]"></div>
    <div :class="[classA, { classB: isB, classC: isC }]">

    <!-- style 绑定 -->
    <div :style="{ fontSize: size + 'px' }"></div>
    <div :style="[styleObjectA, styleObjectB]"></div>

    <!-- 绑定一个有属性的对象 -->
    <div v-bind="{ id: someProp, 'other-attr': otherProp }"></div>

    <!-- 通过 prop 修饰符绑定 DOM 属性 -->
    <div v-bind:text-content.prop="text"></div>

    <!-- prop 绑定. “prop” 必须在 my-component 中声明。 -->
    <my-component :prop="someThing"></my-component>

    <!-- 通过 $props 将父组件的 props 一起传给子组件 -->
    <child-component v-bind="$props"></child-component>

    <!-- XLink -->
    <svg><a :xlink:special="foo"></a></svg>

    .camel 修饰符允许在使用 DOM 模板时将 v-bind 属性名称驼峰化,例如 SVG 的 viewBox 属性:

    <svg :view-box.camel="viewBox"></svg>

    在使用字符串模板或通过 vue-loader/vueify 编译时,无需使用 .camel



v-cloak

  • 不需要表达式

  • 用法:

    这个指令保持在元素上直到关联实例结束编译。和 CSS 规则如 [v-cloak] { display: none } 一起用时,这个指令可以隐藏未编译的 Mustache 标签直到实例准备完毕。

  • 示例:

    [v-cloak] {
    display: none;
    }
    <div v-cloak>
    {{ message }}
    </div>
    不会显示,直到编译结束。

组件化

项目目录




 

 

最开始是MVC模式,这里 

vue学习之路之MVC,MVP,MVVM之间的区别和联系

M代表的是model负责提供数据,V是视图view,C 代表控制器,他们之间是单向通信,V和M之间的通信是通过C来作为桥梁的,也就是说V和M并不是直接通信;

再后来的是MVP模式,这里的P代表presenter,其和MVC之间唯一的不同点在于V和P只之间的并不是直接通信的,是通过接口来通信的,而且还是双向的;
MVVM最大的特点在于数据的数据的双向绑定,当视图V变化的时候,ViewModel也会跟着变化,相反ViewModel变化的时候View变化,这样做最大的好处就是,开发者不用再把精力放在无休止的操作DOM上,大大提高了生产的效率。其中
可是为什么会从MVC再到MVP最后演变到MVVM,以上就是原因(数据的双向绑定),这也是和jQuery的一大不同之处吧。
它的基本思想与 Angular 类似,但是用法更简单, VUE和Angular相比,
而且比angular清凉的多。

 vue总结

https://www.cnblogs.com/caojiayan/p/6282974.html

https://www.cnblogs.com/whocare/p/6528618.html

vue脚手架的使用

https://www.cnblogs.com/libin-1/p/6833373.html

https://blog.csdn.net/hhzzcc_/article/details/79251027

全栈工程师的参考文档

http://www.100phone.cn/category/vue2/

原文地址:https://www.cnblogs.com/wqxh/p/8887901.html