vue3知识点总结(四)

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

前言

大家好呀,我是L同学。在上篇文章vue3知识点总结(三)中,我们学习了vue3的知识点,包括toRef函数、toRefs函数、computed函数等相关知识点。今天,在这篇文章中,我们将继续学习vue3,包括watch函数、ref 属性、vue中废弃了过滤器等相关知识点。

watch函数

watch函数,是用来定义侦听器的。

watch函数可以监听: 1、监听ref定义的响应式数据 2、监听多个响应式数据数据 3、监听reactive定义的响应式数据 4、监听reactive定义的响应式数据,某一个属性 5、深度监听 6、默认执行

当你需要监听数据的变化就可以使用watch:监听一个ref数据:第一个参数是需要监听的目标。第二个参数是改变后触发的函数。

watch也可以监听多个数据的变化。

需要注意的是,此时监听对象中某一个属性的变化,例如:obj.name,需要写成函数返回该属性的方式才能监听到。

<template>
  <div class="container">
    <div>
      <p>count的值:{{count}}</p>
      <button @click="add">改数据</button>
    </div>
    <hr>
    <div>
      <p>{{obj.name}}</p>
      <p>{{obj.age}}</p>
      <p>{{obj.brand.name}}</p>
      <button @click="updateName">改名字</button>
      <button @click="updateBrandName">改品牌名字</button>
    </div>
  </div>
</template>
<script>
import { reactive, ref, watch } from 'vue'
export default {
  name: 'App',
  setup () {
    const count = ref(0)
    const add = () => {
      count.value++
    }

    // watch(count, (newVal,oldVal)=>{
    //   console.log(newVal,oldVal)
    // })


    const obj = reactive({
      name: 'ls',
      age: 10,
      brand: {
        id: 1,
        name: '宝马'
      }
    })
    const updateName = () => {
      obj.name = 'zs'
    }
    const updateBrandName = () => {
      obj.brand.name = '奔驰'
    }
    // 2. 监听一个reactive数据
    watch(obj, ()=>{
      console.log('数据改变了')
    })

    watch(()=>obj.brand, ()=>{
      console.log('brand数据改变了')
    },{
      // 5. 需要深度监听
      deep: true,
      // 6. 想默认触发
      immediate: true
    })

    // 3. 监听多个数据的变化
    // watch([count, obj], ()=>{
    //   console.log('监听多个数据改变了')
    // }) 


    // 4. 此时监听对象中某一个属性的变化 例如:obj.name 
    // 需要写成函数返回该属性的方式才能监听到
    // watch(()=>obj.name,()=>{
    //   console.log('监听obj.name改变了')
    // })

    return {count, add, obj, updateName, updateBrandName}
  }
}
</script>

ref 属性

获取DOM或者组件实例可以使用ref属性,写法和vue2.0需要区分开。单个元素:先申明ref响应式数据,返回给模版使用,通过ref绑定数据。遍历的元素:先定义一个空数组,定一个函数获取元素,返回给模版使用,通过ref绑定这个函数

获取单个DOM或者组件。

<template>
  <div class="container">
    <!-- vue2.0 获取单个元素 -->
    <!-- 1. 通过ref属性绑定该元素 -->
    <!-- 2. 通过this.$refs.box获取元素 -->
    <!-- <div ref="box">我是box</div> -->
    <!-- vue2.0 获取v-for遍历的多个元素 -->
    <!-- 1. 通过ref属性绑定被遍历元素 -->
    <!-- 2. 通过this.$refs.li 获取所有遍历元素  -->
    <!-- <ul>
      <li v-for="i in 4" :key="i" ref="li">{{i}}</li>
    </ul> -->

    <!-- 单个元素 -->
    <div ref="dom">我是box</div>
    <!-- 被遍历的元素 -->
    <ul>
      <li v-for="i in 4" :key="i" :ref="setDom">第{{i}}LI</li>
    </ul>
  </div>
</template>
<script>
import { onMounted, ref } from 'vue'
export default {
  name: 'App',
  setup () {
    // 1. 获取单个元素
    // 1.1 先定义一个空的响应式数据ref定义的
    // 1.2 setup中返回该数据,你想获取那个dom元素,在该元素上使用ref属性绑定该数据即可。
    const dom = ref(null)
    onMounted(()=>{
       console.log(dom.value)
    })
    return {
        dom
    }
  }
}
</script>
<style scoped lang="less"></style>

获取v-for遍历的DOM或者组件。首先,定义一个空数组,接收所有的LI。然后,定义一个函数,往空数组push DOM

    const domList = []
    const setDom = (el) => {
      domList.push(el)
    }
    onMounted(()=>{
      console.log(domList)
    })
    return {dom, setDom}

vue中废弃了过滤器

在vue2.0中是可以使用过滤器的。然而在vue3.0中不能使用过滤器,直接使用函数进行替代过滤器。

以下是使用函数来格式化日期的例子。这个函数将返回已经被格式化的日期。

<template>
  <h3>{{ formatTime(now) }}</h3>
  <h3>{{ formatTime(other) }}</h3>
  <hr />
</template>

<script>
import moment from 'moment'
export default {
  setup() {
    // 过滤器
    const now = new Date()
    const other = new Date('2020-11-12 12:00:00')
    const formatTime = (value) => {
      return moment(value).format('YYYY-MM-DD')
    }
    return {
      now,
      formatTime,
      other,
    }
  },
}
</script>