学习Vue 3.0 (2)

2022-05-29  本文已影响0人  Beppo

Vue3.0 生命周期

  1. Vue3.0 中可以继续使用 Vue2.x 的生命周期钩子,但是有两个被更名
  1. Vue3.0 提供了 Composition API 形式的生命周期钩子

因为 setup 是围绕 beforeCreatecreated 生命周期钩子运行的,所以不需要显式地定义它们。换句话说,在这些钩子中编写的任何代码都应该直接在 setup 函数中编写。

自定义 Hook

// hooks/useMousePosition.js
import { reactive, onMounted, onUnmounted } from 'vue';

export default function () {
  let point = reactive({
    x: 0,
    y: 0
  });

  let useMousePosition = function () {
    document.addEventListener('click', function (e) {
      point.x = e.pageX;
      point.y = e.pageY;
    });
  };

  onMounted(() => {
    useMousePosition(el);
  });

  onUnmounted(() => {
    document.removeEventListener('mousemove', useMousePosition);
  });

  return point;
}

// xxx.vue
<div>
  <p>{{ point.x }}</p>
  <p>{{ point.y }}</p>
</div>
......
import useMousePosition from './hooks/useMousePosition';

const point = useMousePosition();

......

计算属性 computed

<template>
  <div>
    <p>{{name}}</p>
</template>
import { computed } from 'vue';
.....
setup() {
  let firstName = ref('张');
  let lastName = ref('三');

  // 计算属性 -- 简写
  let fullName = computed(() => {
    return firstName.value + ' ' +lastName.value;
  });

  // 计算属性 -- 完整写法
  let fullName = computed({
    get() {
      return firstName.value + '-' + lastName.value;
    },
    set(newValue) {
      let names = newValue.split('-');
      firstName.value = names[0];
      lastName.value = names[1];
    }
  });

  return {
    name
  };
}

watch 函数

import { watch } from 'vue';
.....
let sum = ref(0);
let msg = ref('hello');
let obj = ref({
  a: 1,
  b: 2
});

// 监听ref数据变化
watch(sum, (newValue, oldValue) => {
  console.log(newValue, oldValue);
},{immediate: true});

// 监听ref定义的对象 -- 方法一
watch(obj.value, (newValue, oldValue) => {
  console.log(newValue, oldValue);
});

// 监听ref定义的对象 -- 方法二
watch(obj, (newValue, oldValue) => {
  console.log(newValue, oldValue);
},{deep: true});

// 监听多个ref属性变化
watch([sum, msg],(newVal,oldVal)=>{
  console.log('sum发生变化了',newVal[0],oldVal[0]); // sum发生变化了 1 0
  console.log('msg发生变化了',newVal[1],oldVal[1]); // msg发生变化了 hello hello
});


let person =reactive({
  name: '张三',
  age: 18,
  job:{
    jodOne:{
      name: '前端开发'
    },
  }
});

new

// 监听reactive所定义的响应式对象
// 注意:无法正确的获取到oldValue
// 注意:默认开启了深度监听
watch(person, (newVal, oldVal) => {
  console.log('person发生变化了', newVal, oldVal);
});

// 监听reactive所定义的响应式对象的某个属性
watch(()=>person.age, (newVal, oldVal) => {
  console.log('person.age发生变化了', newVal, oldVal);
});

// 监听reactive所定义的响应式对象的某个属性(该属性值为对象时),deep配置有效
watch(()=>person.job, (newVal, oldVal) => {
  console.log('person.job发生变化了', newVal, oldVal);
},{deep: true});

watchEffect 函数

watchEffect(() => {
  console.log('watchEffect');
});
上一篇 下一篇

猜你喜欢

热点阅读