v2和v3的区别

2.vue3里面的setup和正常写data,methods有什么关系呢.就是能不能一起写.如果冲突了,以谁为主.data,methods这些配置项能不能读取setup里面的东西.setup能不能读取配置项的数据.

答案:data和methods可以和setup同时存在.vue3里面本身是可以写vue2的东西.

data里面可以读取到setup里面的数据.

setup里面无法读取data里面的数据.

 

注意reactive定义的对象不可以整体修改.

ref包裹对象可以直接.value去修改整个对象.但是reative包裹的对象.不同直接修改整个对象.要用object.asign(obj,newobj)去修改

1.computed是只读的,如果想修改要用const newnum = computed({get(){},set(){}})这样的写法,用const newnum = computed(()=> {})是无法做到修改computed的值

2.watch可以监听ref.reative.getter函数返回的一个值.还可以监视这些类型返回的一个数组 .

如何监听ref控制的简单数据类型

const num = ref(0)
1 const stop = watch(num, (newval, oldval) => { 2 if (newval === 5) { 3 stop(); 4 } 5 });

watch监听ref控制的对象类型,那他监视的是对象的地址值.如果没有深度监听,只是单纯修改对象的属性.watch还监视不到.除非修改了整个对象.那就可以监视到.如果想修改属性的时候也监视到就要手动开启深度监听

 1 let person = ref({
 2   name: '张三',
 3   age: 18,
 4 });
 5 function changename() {
 6   person.value.name += '*';
 7 }
 8 function changeage() {
 9   person.value.age += 1;
10 }
11 function changeperson() {
12   person.value = {
13     name: '王五',
14     age: 22,
15   };
16 }
17 
18 watch(
19   person,
20   () => {
21     console.log(person)
22   }, {
23   deep: true,(手动开启深度监听)
24   immediate: true,(一上来就先执行一下)
25 }
26 );

 watch监听reative定义的对象类型,他不用写深度监听.他是默认开启深度监听的,且这个深度监视是不可以关闭的,如果修改对象里面的属性.地址值没变.所有不管是ref监听的.还是reatvie监听的对象.newval.oldval都是一样的

 1 let person = reactive({
 2   name: '张三',
 3   age: 18,
 4 });
 5 let obj = reactive({
 6   a: {
 7     b: {
 8       c: 'hello',
 9     },
10   },
11 });
12 function changename() {
13   person.name += '*';
14 }
15 function changeage() {
16   person.age += 1;
17 }
18 function changeperson() {
19   console.log(person)
20   person = {
21     name: '李四',
22     age: 20,
23   };
24   console.log(person)
25 }
26 
27 function testobj() {
28   obj.a.b.c += '*';
29 }
30 
31 watch(
32   person,
33   (newval, oldval) => {
34     console.log(newval)
35     console.log(oldval)
36   }, {
37 }
38 );
39 
40 watch(
41   obj,
42   (newval, oldval) => {
43     console.log('obj修改了 ')
44     console.log(newval)
45     console.log(oldval)
46   },
47 );

watch监视ref.或者reative定义的对象类型的某个属性.

(监视响应式对象的某个属性.且该属性是基本类型)

image

 

 1 let person = reactive({
 2   name: '张三',
 3   age: 18,
 4   car: {
 5     c1: '宝马',
 6     c2: '奔驰'
 7   }
 8 })
 9 
10 watch(() => { return person.name }, (newVal, oldVal) => {
11   console.log('person发生了变化', newVal, oldVal)
12 }, { deep: true })
13 </script>

如果是监听响应对象里面的对象

let person = reactive({
  name: '张三',
  age: 18,
  car: {
    c1: '宝马',
    c2: '奔驰'
  }
})
function changeName() {
  person.name += '*'
}
function changeAge() {
  person.age = 20
}
function changeCar1() {
  person.car.c1 = '比亚迪'

}
function changeCar2() {
  person.car.c2 = '五菱'
}
function changeCar() {
  person.car = {
    c1: '雅迪',
    c2: '小牛'
  }
}

watch(person.car, (newVal, oldVal) => {
  console.log('name changed:', newVal, oldVal)
})
注意这里修改car.c1和car.c2都有变化.但是修改整个car却没有变化

所以因为有这个问题存在.所以如果监听响应式对象里面的对象.建议用函数的写法,而且deep:true一定要带上.以后就直接这样写

 1 let person = reactive({
 2   name: '张三',
 3   age: 18,
 4   car: {
 5     c1: '宝马',
 6     c2: '奔驰'
 7   }
 8 })
 9 function changeName() {
10   person.name += '*'
11 }
12 function changeAge() {
13   person.age = 20
14 }
15 function changeCar1() {
16   person.car.c1 = '比亚迪'
17 
18 }
19 function changeCar2() {
20   person.car.c2 = '五菱'
21 }
22 function changeCar() {
23   person.car = {
24     c1: '雅迪',
25     c2: '小牛'
26   }
27 }
28 
29 watch(() => person.car, (newVal, oldVal) => {
30   console.log('car changed:', newVal, oldVal)
31 }, { deep: true })

所以person.car监听的话.可以直接写.但是监听不到整个对象的变化.也可以写函数.更推荐直接写函数的写法.加上deep:true

监听响应式对象里面的多个属性.可能有简单数据.也可能是对象类型

 1 let person = reactive({
 2   name: '张三',
 3   age: 18,
 4   car: {
 5     c1: '宝马',
 6     c2: '奔驰'
 7   }
 8 })
 9 function changeName() {
10   person.name += '*'
11 }
12 function changeAge() {
13   person.age = 20
14 }
15 function changeCar1() {
16   person.car.c1 = '比亚迪'
17 
18 }
19 function changeCar2() {
20   person.car.c2 = '五菱'
21 }
22 function changeCar() {
23   person.car = {
24     c1: '雅迪',
25     c2: '小牛'
26   }
27 }
28 
29 watch([() => person.name, () => person.car.c1, () => person.car.c2], (newVal, oldVal) => {
30   console.log('name changed:', newVal, oldVal)
31 })

watch和watchEffect的区别

watch需要明确的告诉他.我需要监视谁.但是watchEffect不用明确的告诉他,一上来就要执行一次.就是watchEffect加了立即监视全自动监视 ,他会自动看里面的判断,不用一个一个写watch.

 1 let temp = ref(0)
 2 let waterHeight = ref(0)
 3 
 4 
 5 function changetemp() {
 6   temp.value += 10
 7 }
 8 
 9 function changeWaterHeight() {
10   waterHeight.value += 10
11 }
12 watchEffect(() => {
13   if (temp.value > 100 || waterHeight.value > 100) {
14     console.log('可以了.可以停止加温或者加水了')
15   }
16 })

 

ref的使用,当前页面的ref可以拿到这个dom元素.如果是父组件要拿到子组件的示例.就在子组件标签上写上ref.但是一般拿不到子组件的数据.需要子组件用deineExpose.来暴露出来,暴露出来父组件才能看

image

image

 ts的使用.要定义一个interface 暴露出去.分别是默认暴露.分别暴露.统一暴露.interface 是一个规范一个类型.

先定义一个规则

1 export  interface PersonInter {
2   id: string,
3   name: string,
4   age: number,
5   sing:object
6 }

使用的时候

 1 import { ref } from 'vue';
 2 import { type PersonInter } from '../types/index';
 3 // 这样写法是说明.这个对象的类型是PersonInter,要符合PersonInter的规范
 4 const persondata: PersonInter = {
 5   id: '001',
 6   name: '张三',
 7   age: 18,
 8   sing: {
 9     name: '歌唱祖国',
10   }
11 };
12 // 这样写法是说明.这个personlistArr是数组且数组里面每一项要符合PersonInter的规范
13 const personlistArr: Array<PersonInter> = [{
14   id: '001',
15   name: '张三',
16   age: 18,
17   sing: {
18     name: '歌唱祖国',
19   },
20 }, {
21   id: '001',
22   name: '张三',
23   age: 18,
24   sing: {
25     name: '歌唱祖国',
26   }
27 }]

当然这样写感觉页面有些臃肿.可以换一种方便的写法.

1 export  interface PersonInter {
2   id: string,
3   name: string,
4   age: number,
5   sing:object
6 }
7 export type personType =Array<PersonInter>     //也可以写成PersonInter[] 把这个类型继续使用起来然后导出

使用的时候

 1 import { type PersonInter, type personType } from '../types/index';
 2 // 这样写法是说明.这个对象的类型是PersonInter,要符合PersonInter的规范
 3 const persondata: PersonInter = {
 4   id: '001',
 5   name: '张三',
 6   age: 18,
 7   sing: {
 8     name: '歌唱祖国',
 9   }
10 };
11 // 这里就可以直接用personType.而不是Array<PersonInter>
12 const personlistArr: personType = [{
13   id: '001',
14   name: '张三',
15   age: 18,
16   sing: {
17     name: '歌唱祖国',
18   },
19 }, {
20   id: '001',
21   name: '张三',
22   age: 18,
23   sing: {
24     name: '歌唱祖国',
25   }
26 }]

props的使用.父向子传值.且添加校验

 路由的query传递和获取

image

 

image

 路由的params传参(第一种写法)

image

 

image

 

image

  路由的params传参(第二 种写法)

image

image

image

 路由规则的props参数第一种写法

image

 路由规则的props传递.第二种写法

image

 编程式路由

image

 pinia的使用

image

image

image

 pinia里面如果修改store里面的数据

image

image

 pinia里面的storetorefs的用法,(不要用torefs这个方法去解构store里面的数据)

image

 pinia里面getters的用法 (可以接state这个参数.也可以直接用this.如果用this的写法就不能换成箭头函数的写法了.)

image

 pinia里面getter也可以用箭头函数的写法

image

 pinia里面如何取getter的数据

image

  

 

posted on 2025-01-21 16:20  荻!!!!!!!!  阅读(180)  评论(0)    收藏  举报