Vue:模板 template

431 阅读3分钟

template 的三种写法

一、Vue 完整版,写在 HTML 里

<div id=xxx>
  {{n}}
  <button @click='add'> +1 </button>
</div>

new Vue({
  el:'#xxx',
  data:{n:0},  //data 可以改为函数
  methods:{
    add(){
      this.n +=1
    }
  }
})

二、Vue 完整版,写在选项里

//index.html文件
<div id=app>
</div>

//main.js 文件
new Vue({
  template:`
    <div>
      {{n}}
      <button @click='add'> +1 </button>
    </div>
  `,
  data:{n:0},  //data 可以改为函数
  methods:{
    add(){
      this.n +=1
    }
  }
}).$mount('#app')

// 细节:index.html 里面的 div#app 会被替代

三、Vue 非完整版,配合 xxx.vue 文件

// vue 文件中
// 这里的 template 标签,里面用的是 xml 语法,不是 html 语法。
<template>
  <div>
    {{n}}
    <button @click='add'> +1 </button>
  </div>
</template>

<script>
  export default {
    data(){ 
      return {n:0} 
    },    // data 必须为函数
    methods:{
      add(){ 
        this.n += 1 
      }
    }
  }
</script>
<style>这里写 CSS </style>

// main.js 文件
// 组件名 XXX 用大写开头
import Xxx from './xxx.vue'
new Vue({
  render: h => h(Xxx)  //非完整版,只能用 render 函数
}).$mount('app')

template 的语法

展示内容

  • 表达式 1、{{ object.a }} 表达式;

2、{{ n+1 }} 写任何运算,但不能写 if else;

3、{{ fn(n) }} 可以调用函数;

4、如果值为 undefined 或 null ,就不显示。

  • HTML 内容 1、假设 data.x 的值为<strong> hi </strong> ;

2、<div v-html='x'></div>即可显示粗体的 hi ;

  • 展示 {{ n }} 1、<div v-pre>{{ n }}</div>

2、v-pre 不会对模板进行编译。

绑定属性

  • 绑定 src 1、img v-bind:src='x' />

2、v-bind: 简写为 <img :src='x' />

  • 绑定对象 <div :style="{border:'1px solid red',height:100}"</div> //这里可以把 ‘100px’ 写成 100

绑定事件

  • v-on:事件名
<button v-on:click='add'>+1</button>
//点击之后,VUe 会运行 add()

<button v-on:click='xxx(2)'>xxx</button>
//点击之后,Vue 会运行 xxx(2)

<button v-on:click='n += 1'>xxx</button>
//点击之后,Vue 会运行 n += 1

总结:

1、发现函数就加括号调用,否则就直接运行代码;

2、xxx(2) 一般返回一个值,不要返回函数;

  • 缩写 <button @click='add'>+1</button> 一般都用缩写

条件判断

  • if else
<div v-if="x>0"> x大于0 </div> //如果x>0,就显示这个div
<div v-else-if="x===0"> x等于0 </div>   //如果x===0,就显示这个div
<div v-else="x<0"> x小于0 </div> //如果x<0,就显示这个div

循环

  • for(value,key) in 对象或数组
<ul>
  <li v-for="(u,index) in users" :key="index">
    索引:{{index}} 值:{{u.name}}
  </li>
</ul>

<ul>
  <li v-for="(value,name) in obj" :key="name">
    属性名:{{name}} 属性值:{{value}}
  </li>
</ul>

// :key="index" 大部分时候没问题,但是在一些复杂的项目里面可能会有 bug。

显示、隐藏

  • v-show <div v-show="n%2 === 0"> n 是偶数 </div>

  • 近似等于

<div :style="{display:n%2 === 0 ? 'block' : 'none'}"> n 是偶数 </div>

//看得见的元素 display 不只有 block ,如 table 的 display 为 table ;li 的 display 为 list-item;

指令 Directive

什么是指令

<div v-text='x'></div><div v-html='x'></div> 以 v- 开头的东西就是指令

语法

1、v-指令名:参数=值,如:v-on:click="add"

2、如果值里没有特殊字符,可以不加引号;

3、有些指令没有参数和值,如 v-pre ;

4、有些指令没有值,如 v-on:click.prevent

修饰符

v-on 支持的

  • .keycode
  • .keyAlias
  • .stop
  • .prevent
@click.stop='add' //表示阻止事件传播/冒泡,并且调用 add 函数

@click.prevent='add'  //表示阻止默认动作

@click.stop.prevent='add'  //同时阻止两种

@keypress.enter = 'xx'

@keypress.13 = 'xx'  //回车的keycode 是 13

v-model 支持的

  • .lazy
  • .number
  • .trim

v-bind 支持的 .sync

  • .sync 用途:当父子组件交互,当父组件通过props传值进子组件,子组件想要改变这个值时(一般直接修改会报错),可以这么做:子组件触发事件,通知父组件改变这个绑定的值,

原理:实现原理是:利用eventBus,在子组件中通过$emit触发update事件并传参,然后父组件可以通过$event来接收$emit的参数。

1、在包含moneyprop的子组件中,可以用下面的方法表达对其赋新值的意图:

this.$emit('update:money', newMoney)

2、然后父组件可以监听 update:money事件,

<div>
  :money='total' 
  v-on:update:money='total=$event'
</div>

3、以上代码可以缩写,即用.sync修饰符:

<div :money.sync="total"></div>
// App.vue
<template>
  <div class="app">
    App.vue 现在有 {{total}}
    <hr>
    <Child :money.sync="total" />
  </div>
</template>

<script>
import Child from "./Child.vue"
export default {
  data(){
    return { total: 10000 };
  },
  components:{ Child: Child }
}
</script>

<style>
.app{
  border: 3px solid red;
  padding:10px;
}
</style>

// Child.vue
<template>
  <div class="child">
    {{ money }}
    <button @click="$emit('updata:money', money-100)">
      <span>花钱</span>
    </button>
  </div>
</template>

<script>
export default {
  props:["money"]
}
</script>

<style>
.child {
  border:3px solid green;
}
</style>

//父组件将参数 total 通过 props 传给 Child 组件,然后 Child 组件触发 click 事件时,调用 $emit() 函数,$emit 触发 update:money 事件,并传递参数 money-100 给父组件,父组件监听 update:money 事件,并且通过 $event 获取到传过来的参数,更新 total 的值。
  • 注意: 带有 .sync修饰符的v-bind不能和表达式一起使用,例如v-bind:title.sync="doc.title + '!' " 是无效的,取而代之的是,只能提供想要绑定的 property 名。
  • 一个对象设置同时设置多个 prop 时,可以将.sync修饰符和v-bind配合使用
<div v-bind.sync="doc"></div>
// 这样会把`doc`对象的每一个property(如title)都作为一个独立的 prop 传进去,然后各自添加用于更新的`v-on`监听器
  • v-bind.sync不能用在一个字面量的对象上。 1、例如v-bind.sync="{title:doc.title}"无法正常工作

2、字面量对象:javascript中对象字面量的理解

Vue 的规则

组件不能修改 props 外部数据

this.$emit 可以触发事件,并传参

$event 可以获取 $emit 的参数