Vue书写中的细节

276 阅读1分钟

1. 模板中所有用到this.xxx都不要写this.xxx而是就写xxx就行了

  • 比如 this.gender 这个数据在模板中就写 gender 就行了
  • 再比如 this.$emit 在模板中 ===> $emit

2. 当用到computed或者watch的高级功能时,书写方面注意两点

3. 监听对象中的属性时,Vue允许我们有这几种写法

4. :class 书写注意点

class 可与 :class并存

<div class="app" :class="`theme-${themeName} fontSize-${fontSizeName}`">
	前者是字符串	后者是js表达式

字符串与表达式混合

<div :class="`app theme-${themeName} fontSize-${fontSizeName}`">
	字符串 js表达式混在一起

对象式

<div :class="{ active: isActive }"></div>

对象式-1

<div :class="classObject"></div>
data: {
  classObject: {
    'active': true,
    'text-danger': false
  }
}

对象式-2

<div :class="{classObject}"></div>
data: {
  classObject: true
}

计算属性语法 --- 用于逻辑太过复杂的情况

<div v-bind:class="classObject"></div>
data: {
  isActive: true,
  error: null
},
computed: {
  classObject: function () {
    return {
      active: this.isActive && !this.error,
      'text-danger': this.error && this.error.type === 'fatal'
    }
  }
}

结合模板字符串

// 第一种 有classPrefix的话...
  <div :class="classPrefix&& `${classPrefix}-wrapper`"> 
// 第二种 es6中的括号语法[],让对象中可以使用到变量, 后面的classPrefix表示如果classPrefix则true,没有classPrefix当然就是false了
   <ul :class="{[classPrefix+'-types']:classPrefix}">
  1. 组件在模板上的书写

到处都用小驼峰写法是一定不会错的

components:{ChangeThemeButton} ===>   <change-them-button/>
  1. :value="1"
<input type="checkbox" :value="1">   ===> 这个1是数字类型的1而非字符串
<input type="checkbox" value="1">    ===> 这个1是字符串类型的1而非数字
  1. v-on 配合 $emit 一定要写在父组件模板中的子组件身上,你写别处是根本监听不到的
<Child v-on:xxx="fn"> // 
  1. 获取输入框内容的写法问题

    在线示例

  • 本组件中, 获取输入框的内容可以写 @input="xxx = $event.target.value 也可在 methods 中用e.target.value;

  • 而父子组件中就要看子组件传过来的是 $event 还是 $event.target.value

  • 若子组件 this.$emit(..., $event)@input="xxx = $event.target.value"

  • 若子组件 this.$emit(..., $event.target.value)@input="xxx = $event"

  1. 事件监听不要把函数直接写上去
  • 错误
  • 正确
  1. labels在html结构上的写法 VS labels在内存中获取的写法
  • labels在html结构上的写法
  <Layout content-class="xxx"> // 注意写成content-class
  • labels在内存中获取的写法
<script lang="ts">
export default {
  name: 'Layout',
  props:['contentClass'] // 注意 从内存中拿参的时候是小驼峰
};
</script>
<div class="content" :class="contentClass"> // 那么拿到值之后写的时候也是驼峰写法
## Vue中render的三种写法
```js
// 写法1  老实人写法
new Vue({
  render: function (h) {
    return h(App);
  }
}).$mount("#app");
// 写法2 旧社会写法
new Vue({
  render(h) {
    return h(App);
  }
}).$mount("#app");
// 写法3 arrow写法
new Vue({
  render: (h) => h(App)
}).$mount("#app");

12 this.$el 表示的是当前组件自身的最外层结构 在线示例

mounted(){
	const dom = this.$el.querySelector('xxx')
}

13 Vue中最好都用小驼峰写法,只要遇到大写字母,都会给你转换成 - 加小写的形式

fontSize ===> font-size

14 Vue click事件如何既要传参又要能获取 event.target 在线示例

当你 @click="onClick" 时(即没有任何传参), 那么在 methods 中系统默认会传一个参(即事件对象)

但当你 @click="onClick(1)" 时(即手动传了一个参), 那么只有手动再传 $event 才能够在 methods 中接收到事件对象 @click="onClick(1, $event)"

<button @click="handle(传的参, $event)">
methods:{
	handle(n,e){
    	console.log(n,e.target)
    }
}

15 父子组件传递时,确保子组件传递的是 e.target.value 而不是 e

  • 如果你要用 v-model="value" 或者是 v-bind:value.sync="value" 的写法
  • 确保子组件传递的是 e.target.value 而不是 e
  • 因为这两者本质是 语法糖, 都替代了以下的写法
@input = "value = $event"
@change = "value = $event"
@update:value = "value = $event"

如果你传递的是 `e`, 结果就是打印出 `[object InputEvent]`, 即输入类型的事件对象

在线示例可供测试

16 父子组件传递时,不写 $event 也可以写 形参

使用了 .sync
<comp :foo.sync="bar"></comp>

未使用 .sync 这里用了$event
<comp :foo="bar" @update:foo="bar = $event"></comp>

未使用 .sync 这里可以不用$event而是用函数形式
<comp :foo="bar" @update:foo="val => bar = val"></comp>