Vue3查漏补缺(读官方文档的第一天)

98 阅读2分钟

vue 模板语法-动态参数:

<a :[attributeName]="url"> ... </a>

可以动态的绑定属性和事件.会先计算[ ]中的js表达式的值,再将值作为需要绑定的属性. 要求最终必须是字符串或者是null,为null会移除这个属性,若为其他类型,则触发一个warning.

推荐将attributeName,作为一个计算属性.来计算值.

vue-响应式对象

响应式对象的具体原理 JavaScript Proxy

响应式对象是默认深层响应式. 所以不要使用太深层次的对象.会影响性能. shallowReactive(),是浅层次的数据相应式,只有顶层可以数据.

reactive 赋值或解构至本地变量,或将属性传入到函数中时,都会丢失响应式. ref,从一般对象,或者传递给函数,不会丢失响应.是模板渲染上下文的顶层属性时才适用自动“解包”。

computed-计算属性

const yourComputedName = computed(()=>{
// 需要确定最终的值.
    return xxx 
})

最终接收的值,是一个计算属性ref. 因为是在模板中引用,所以不需要".value".

可写的计算属性(设置get setter)的值.(用的少,但是还是要记一下) get等于原本的, set(newValue)中的值是计算属性的新值.

const fullName = computed({
      // getter 
      get() {
        return firstName.value + ' ' + lastName.value
      },
      // setter 
      set(newValue) {
        // 注意:我们这里使用的是解构赋值语法 
        [firstName.value, lastName.value] = newValue.split(' ')
      }
    })

getter中最好不要有任何副作用函数(异步请求和更改 DOM).推荐用watch去做.

class与style 动态绑定(几种用法)

可以与其他的class共存.

1. :class="{ active: isActive }"
2. :class="{ active: isActive, 'text-danger': hasError }"
3.  const classObject = computed(() => ({
       active: isActive.value && !error.value,
      'text-danger': error.value && error.value.type === 'fatal'
    }))
4. :class="[isActive ? activeClass : '', errorClass]"
   // 使勇三元表达式,来选择你要表述的类.
   
5. :class= "[{isActive:activeClass},errorClass]"

在组件上使用: 如果组件内只有一个根组件,那组件名上的class的类名,都会移动到唯一的根组件上. 若有多个根组件,需要指定一个根组件来接收.

:class="$attrs.class"

事件处理

如果你想使用自定义事件时,任然要接收原生 DOM 事件,可以这么做.

//方式一: 使用特殊参数 $event
@click = "onClick('你自定义的参数',$event)"

// 方式二: 使用箭头函数,用参数取接一下
@click = "(event) => onClick('你自定义参数',event)"

v-model 修饰符

v-model.lazy 表示只有数据变化后,才会更新. 原本是(输入是input事件时更新) .number 是自动将输入转入数字,转不了,就保留原来的值. .trim 去除前后两段的空格

生命周期函数

请不要把生命周期函数写到定时器等其他异步函数中,会丢失组件示例.

watch 侦听属性

有多个参数,第一个参数是要监听的值.可以是ref, getter函数,多个响应数据组成的数据. 第二个是副作用函数.第一个值变了,需要执行的函数. 第三个参数,是个对象 { deep: true } 深度监视. { immediate: true } 立即执行一遍.

let x = ref('')
watch(x,()=>{ })

// 若只监测一个reactive中的一个属性,不可以用直接监听. x.count
需要写成getter模式.
watch(( )=>x.count,()=>{ })

组件上的 v-model

<MyComponent v-model="searchText">
等同于:
<input :value="searchText" @input="searchText = $event.target.value" />

现在给v-model加上参数v-model:title 子组件内要怎么处理. 没有参数时,默认为modelValue, v-model可以同时使用多个.绑定到组件内的元素上就可以了.

父组件:
<MyComponent v-model:title="searchText">
子组件:
<script setup>
const emits = defineEmits(['update:title'])
const props = defineProps(['title'])
<script>

<template>
    <input type="text" :valse= "title" @input = "$emit('update:title',$event.target.value)">
</template>

v-model还可以去自定义修饰符. 修饰符用modelModifiers去承接它.modelModifiers默认是一个空对象.有那个参数,值就是true. modelModifiers需要放在props的最后面.

<script setup>
const props = defineProps({
  modelValue: String,
  modelModifiers: { default: () => ({}) }
})

const emit = defineEmits(['update:modelValue'])

function emitValue(e) {
  let value = e.target.value
  if (props.modelModifiers.capitalize) {
    value = value.charAt(0).toUpperCase() + value.slice(1)
  }
  emit('update:modelValue', value)
}
</script>

<template>
  <input type="text" :value="modelValue" @input="emitValue" />
</template>