首页 > 其他分享 >vue3总结

vue3总结

时间:2024-01-18 18:44:09浏览次数:24  
标签:总结 const name reactive let vue3 组件 ref

一、Options API (选项式) 和 Composition API(组合式)

      

结合hooks:提供了一种在函数组件中共享逻辑和状态的方式。(契合组合式api)

例:

 1.新建hooks文件夹,存放多个处理文件(js、ts)

import { onMounted , reactive } from "vue";
import axios from "axios";

export default function () {
  const dogList = reactive([
    "https://images.dog.ceo//breeds//pembroke//n02113023_5881.jpg",
  ]);
  const getDog = async () => {
    try {
      let result = await axios.get(
        "https://dog.ceo/api/breed/pembroke/images/random"
      );
      dogList.push(result.data.message);
    } catch (error) {
      alert(error);
    }
  };
  onMounted(() => {});
  return { dogList, getDog };
}

 2.页面中处理

<script setup>
import useDogs from "@/hooks/useDogs";
import useSum from "@/hooks/useSum";

const { dogList, getDog } = useDogs();
</script>

 

二、ref和reactive

ref : 1. 定义基本类型;2.对象类型的响应数据(底层实现逻辑还是借用reactive)

reactive : 只能定义对象类型的相应数据

区别:

reactive重新分配一个对象,会失去响应式(可以使用Object.assign替换整个对象的值)

例:
   
   let  a = reactive( { id : '1', name : '11'}) ;
   
   Object.assion(a, {id : ' 2 ' , name : '22'});  => a被完全覆盖,替代成响应式,普通赋值不能成为响应式

 用法:

1.若需要一个基本类型,使用ref;

2.若需要一个响应对象,层次不深,都行;

3.若需要一个响应对象,且层次较深,推荐reactive;

快捷(.value)

TypeScript Vue Plugin (Volar)  

  

三、computed和watch

 computed:(定义的值为ref属性)

     1.只读

let fullname = computed(() => {   return name.value + '-' + age.value}) // 不可强普通赋值和强制修改 

     2.可读可写

let fullname = computed({
  get() {
    return name.value + '-' + age.value
  },
  set(val) {
    // 监视当前值变化,更改相关值
  }
})

watch:

   1.只能定义以下四种数据

      ①  ref定义的数据 【基本数据、对象数据】

      ② reactive定义的数据【隐式开启深度监听】

      ③ 函数返回一个值(getter函数=>一个函数的返回值)

const person = reactive({
name:'1',
age:'2',
relation:{
sister:2,
brother:1
}
});

watch(() => person.name, (val) => { console.log('变化'); })

// 监视如果是对象里属性,最好函数式,若是对象监视的是地址(当前监听的是整个relation变化,内部变化不会关注),若需要关注对象内部,需手动开启深度监听,如不关注,只会监听 relation.sister和relation.brother
watch(() => person.relation, (val) => {
  console.log('变化');
},{deep:true}) // 最佳解决方案
 

      ④ 一个包含上述内容的数组

watch([()=>person.name,person.relation],()=>{
console.log('变化了‘);
},{deep:true})

     注:deep 深度   immediate 立即监听 

watchEffect:(不用明确指明属性,需要监视哪些就用哪些)

watchEffect(()=>{
    if(){}
})

三、 ref

   ref在组件标签上时,如果父组件需要访问子组件定义的值或方法,需要在子组件引入defineExpose({x,x,x})导出,defineExpose导出值是非响应式的,需通过方法改变

// 父组件
<father ref='fa'></father>
let fa = ref();
console.log(fa) // 就可读取a,b 值
const changeC = ()=>{
fa.value.c() // 调用可改变b的值
}
// 子组件
ler a = ref(1);
let b = ref(2);
const c =()=>{
b.value = '测试改变'
}
defineExpose({a,b,c})

// $refs可获取所有子组件实例化对象 实现父子通信   $refs.fa // $parent可获取父组件参数,实现子父通信,父组件也需要defineExpose

 四、toref 、torefs、storeTorefs

   toref : 单个解构赋值转响应式

   torefs : 多个解构赋值转响应式

let person = reactive(   {     name: "测试",     age: 8,   } )
let { name, age } = person; // 解构为非响应式
let { name, age } = torefs(person);//解构为响应式

let name = person.name // 非响应式
let name = toref(person, 'name'); // 响应式

  storeTorefs:只会关注store中的数据,不会对方法进行ref包裹(pinia状态管理专属)

import { storeToRefs } from "pinia";

let { name,age} = storeToRefs(useCount);
$subscribe:store里的订阅(相当于监听)
useCount.$subscribe((mustate,state)=>{
  console.log('里面保存的数据保存变化',mustate,state);
})

五、组件通信

 defineProps (父传子,函数可子传父;祖传孙  子组件做数据转接  v-bind="$attrs"  同理通过函数也可实现孙传祖。只是存在中间人)

 

  <!-- 父组件 -->
  <div>
    <child :a="a" :childPro="childPro"></child>
  </div>
const childPro = (e)=>{
} <!-- 子组件 --> <div> <p>{{ a }}</p> <button @click="childPro(e)">点击我调用父组件方法</button> </div> const getInfo = defineProps(["a","childPro"])
getInfo.a

 

defineEmits (子传父)

  <!-- 父组件 -->
  <div>
    <child :a="a" @childPro="childPro"></child>
  </div>
  const childPro = (e)=>{
  }

  <!-- 子组件 -->
  <div>
    <p>{{ a }}</p>
    <button @click="emit(childPro,e)">点击我传递参数</button>
  </div>
   const emit = defineEmits(["childPro"])    

 任意组件通信(总线程)

import mitt from "mitt";

const emitter = mitt();

export default emitter;


// 引用
import { emitter } from "@/utils/emitter";

// 绑定事件
emitter.on("a", (e) => {
  console.log("a被调用了");
});

emitter.on("b", (e) => {
  console.log("b被调用了");
});

// 触发事件

emitter.emit("a", e);
emitter.emit("b", e);

// 解绑事件  组件卸载时解绑,优化内存
emitter.off("a");
emitter.off("b");
// 清空 emitter.all.clear();

 祖孙通信(不存在中间人)

// 祖组件
import { provide, ref } from "vue";

① const a = ref("");
   provide("a1", a);
② const updateA = (e)=>{
a+="-"
}
provide('a1',{a,updateA})
// 孙组件 import { inject } from "vue"; ① let x = inject("a1");
② let { a,updateA } = inject("a1");
updateA(e)

 

标签:总结,const,name,reactive,let,vue3,组件,ref
From: https://www.cnblogs.com/HopeInTheDark/p/17966031

相关文章

  • 人性铁律,人性总结
    人性铁律:1.亲不过父母,近不过夫妻。2.除了父母,没有人关心你快不快乐,所有人都在看你有没有用。3.一代亲,二代表,三代四代就拉倒。4.真姑妈,假舅妈,半真半假是姨妈。5.所有的亲戚里面,“舅舅”才是最靠谱的。6.姐妹再好,吃亏就吵。7.兄弟再好,借钱就恼。8.人与人的关系本质,只是利益......
  • 一文掌握Vue3函数式组件中的confirm实现技巧!
    在做后台项目时候,使用声明式组件比较多,就是写一个.vue文件,在里面写template、script、style哪里需要,就在哪里导入。而对于前台项目而言,我们期望可以直接通过方法的形式调用,利用函数式组件,在封装时除了要写.vue,还要多一个手动渲染和卸载的步骤。我们可以通过h函数可以生成一个vno......
  • Vue3.0 路由动画(页面跳转)
    前言vue3.0的页面组件之前切换的动画效果,在移动端H5页面,交互体验比较好,就是带Vue3的Transition组件 之前的写法是 Transition的组件要包在routerView外面,但是3.0的语法就是要在在里面了,不然会黄色警告<divclass="animation"><RouterViewv-slot="{Component,......
  • Spring ResourceLoader 总结
    ResourceLoader总结Spring将采用和ApplicationContext相同的策略来访问资源。也就是说,如果ApplicationContext是FileSystemXmlApplicationContext,res就是FileSystemResource实例;如果ApplicationContext是ClassPathXmlApplicationContext,res就是ClassPathResource实例当Spring应......
  • 开发遇到的问题总结---mysql建表报SQL 错误 [1067] [42000]: Invalid default value f
    报错内容:SQL错误[1067][42000]:Invaliddefaultvaluefor'begin_time'sql语句:CREATETABLE`tb_seckill_voucher`(`voucher_id`bigint(20)UNSIGNEDNOTNULLCOMMENT'关联的优惠券的id',`stock`int(8)NOTNULLCOMMENT'库存',`creat......
  • HBuilderX mac M1 打包 vite/vue3 报错处理办法(pnpm)
    项目运行h5的时候都没有问题,但是要运行到微信开发者工具的时候打包报11:40:54.480Specificallythe"esbuild-darwin-arm64"packageispresentbutthisplatform11:40:54.480needsthe"esbuild-darwin-64"packageinstead.Peopleoftengetintothis很好看去论......
  • 1.17每日总结
    Python3基本数据类型Python中的变量不需要声明。每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在Python中,变量就是变量,它没有类型,我们所说的"类型"是变量所指的内存中对象的类型。等号(=)用来给变量赋值。等号(=)运算符左边是一个变量名,等号(=)运算符右边是存储在......
  • 2023年总结,2024年展望
    前言转眼2023年就过去了。好像都没什么感觉,时间过得太快了,好像没留下多少痕迹。感觉疫情后整个人都没什么冲劲,加上大环境也不太好,什么职业规划、个人发展,好像都没什么人提了。不过虽然别人不提,现在这个环境下也没啥职业好规划的,先保住饭碗就好了,但是个人发展,还是要默默的、持......
  • sql注入知识点总结
    mysql基础知识删除数据库dropdatabase库名;创建数据库createdatabase库名;php中使用sql语句来创建$sql='createdatabasedatabase_name';$retval=mysqli_query($coon,$sql);选择数据库usedatabase_name;php中使用mysqli_select_db($conn,'database_name')......
  • Java期末知识点总结(不全)
    Java知识点Lesson1认识javaLesson2-3认识对象:封装数据为类1.类中有成员变量(属性/字段)+成员函数(方法),类是对象的模板/缔造者/抽象/类型2.局部变量和成员变量的区别:(1)定义位置不同:定义在类中的变量成员变量,定义在方法或{}中的是局部变量(2)内存中位置不同:成员变量在堆......