Vue基础

作者: 大锤在学习 | 来源:发表于2019-01-18 18:57 被阅读0次
核心:

1、Vue.js是一个允许采用简洁的模板语法来声明式地将数据渲染进DOM系统
2、在编写代码时,你不需要关注DOM操作,只需要关注逻辑层面即可。
3、组件系统。

示例:
<div id="app-7">
  <ol>
    <todo-item
      v-for="item in groceryList"
      v-bind:todo="item"
      v-bind:key="item.id">
    </todo-item>
  </ol>
</div>
//注册一个“todo-item”Vue组件
Vue.component('todo-item', {
  props: ['todo'],
  template: '<li>{{ todo.text }}</li>'
})
//{{var}}差值表达式

var app7 = new Vue({
//接管id为app-7的DOM元素,与该DOM节点绑定
//挂载点
  el: '#app-7',
//数据
  data: {
    groceryList: [
      { id: 0, text: '蔬菜' },
      { id: 1, text: '奶酪' },
      { id: 2, text: '随便其它什么人吃的东西' }
    ]
  }
})
//bind属性绑定:单向绑定
//v-model:双向绑定
生命周期图示
生命周期图示
模板语法

{{}}:差值表达式(Mustache):

  • 文本:<span>Message: {{ msg }}</span>
  • 原始html:<span v-html="rawHtml"></span></p>
  • JS表达式:{{ ok ? 'YES' : 'NO' }}
    *注意:该特性不能作用于Html特性上,遇到这种情况应该使用 v-bind 指令
指令
指令 功能 简写 备注
v-if,v-else-if, v-else 条件渲染 没有 key 管理可复用的元素
v-for 遍历 没有 1、支持一个可选的第二个参数为当前项的索引<li v-for="(item, index) in items">2、需要为每项提供一个唯一 key属性,理想的 key 值是每项都有的唯一 id
v-bind 属性绑定 :
v-on 事件绑定 @
v-show 条件渲染 没有 v-show 的元素始终会被渲染并保留在 DOM 中,v-if则会销毁
Vue实例属性:
var app = new Vue({
  //挂载点
  el : "",
  //数据
  data : {},
  //方法
  methods : {},
  //计算属性
  computed : {},
  //监听属性
  watch : {}
})
class和style绑定

1、绑定从class

1、对象语法
<div class="static"
     v-bind:class="{ active: isActive, 'text-danger': hasError }">
</div>
data: {
  isActive: true,
  hasError: false
}
结果渲染为:
<div class="static active"></div>
2、数组语法
<div v-bind:class="[activeClass, errorClass]"></div>
data: {
  activeClass: 'active',
  errorClass: 'text-danger'
}
结果渲染为:
<div class="active text-danger"></div>
//注:用在组件上会在组件原基础上添加class
绑定style

1、内联绑定

1、对象语法
//v-bind:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS 属性名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用单引号括起来) 来命名
<div v-bind:style="{ color: activeColor, fontSize: fontSize + 'px' }"></div>
data: {
  activeColor: 'red',
  fontSize: 30
}
//直接绑定到一个样式对象通常更好,这会让模板更清晰
<div v-bind:style="styleObject"></div>
data: {
  styleObject: {
    color: 'red',
    fontSize: '13px'
  }
}
2、数组语法
//数组语法可以将多个样式对象应用到同一个元素上
<div v-bind:style="[baseStyles, overridingStyles]"></div>
事件修饰符
<!-- 阻止单击事件继续传播 -->
<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>

<!-- 只当在 event.target 是当前元素自身时触发处理函数 -->
<!-- 即事件不是从内部元素触发的 -->
<div v-on:click.self="doThat">...</div>

2.1.4 新增
<!-- 点击事件将只会触发一次 -->
<a v-on:click.once="doThis"></a>

2.3.0 新增
<!-- 滚动事件的默认行为 (即滚动行为) 将会立即触发 -->
<!-- 而不会等待 `onScroll` 完成  -->
<!-- 这其中包含 `event.preventDefault()` 的情况 -->
<div v-on:scroll.passive="onScroll">...</div>

使用修饰符时,顺序很重要;相应的代码会以同样的顺序产生。因此,用 v-on:click.prevent.self 会阻止所有的点击,而 v-on:click.self.prevent 只会阻止对元素自身的点击。
按键修饰符
<!-- 只有在 `keyCode` 是 13 时调用 `vm.submit()` -->
<input v-on:keyup.13="submit">

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

全部的按键别名:
https://cn.vuejs.org/v2/guide/events.html
可以通过全局 `config.keyCodes` 对象[自定义按键修饰符别名](https://cn.vuejs.org/v2/api/#keyCodes):

组件*

示例

<div id="components-demo">
  <button-counter></button-counter>
</div>

// 定义一个名为 button-counter 的新组件
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

new Vue({ el: '#components-demo' })

注:
1、你可以将组件进行任意次数的复用:每个组件单独维护它的“count”,因为没用一次组件,就会有一个它的实例被创建。

2、因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods 以及生命周期钩子等。仅有的例外是像 el 这样根实例特有的选项。

data必须是一个函数

data: {
  count: 0
}

通过props向子组件传递数据 (相当于函数的参数)

//当一个值传递给一个prop特性的时候,它就变成了那个组件实例的一个属性。
Vue.component('blog-post', {
  props: ['title'],
  template: '<h3>{{ title }}</h3>'
})

//使用
<blog-post title="My journey with Vue"></blog-post>

*每个组件必须只有一个“根元素”。你可以将模板的内容包裹在一个父元素内

通过事件向父级组件发送消息
调用内建的 $emit 方法并传入事件的名字,来向父级组件触发一个事件

<div id="blog-posts-events-demo">
    <div :style="{ fontSize: postFontSize + 'em' }">
        <blog-post
        v-for="post in posts"
        v-bind:key="post.id"
        v-bind:post="post"
        v-on:enlarge-text="postFontSize += 0.1"
        ></blog-post>
    </div>
</div>

Vue.component('blog-post', {
  props: ['post'],
  template: `
        <div class="blog-post">
            <h3>{{ post.title }}</h3>
          //向父组件发送一个“enlarge-text'”事件
            <button v-on:click="$emit('enlarge-text')">
                Enlarge text
            </button>
            <div v-html="post.content"></div>
        </div>
        `
})

new Vue({
    el: '#blog-posts-events-demo',
    data: {
        posts: [
            { id: 1, title: 'My journey with Vue' },
            { id: 2, title: 'Blogging with Vue' },
            { id: 3, title: 'Why Vue is so fun' }
        ],
        postFontSize: 1
    }
})

通过插槽分发内容

Vue.component('alert-box', {
  template: `
    <div class="demo-alert-box">
      <strong>Error!</strong>
      <slot></slot>
    </div>
  `
})

——————————更多内容——————————————

相关文章