vue3 学习记录

<script setup>
import {computed, reactive, ref, toRefs, watch, watchEffect} from "vue";

let name = ref("张三")
let age = ref(18)
let job = reactive({
  type: "前端工程师",
  salary: 10000
})
let {type} = toRefs(job)  //对象解构赋值
let hobby = reactive(['唱歌', '跳舞', '游戏'])
function sayHello(item) {
  console.log(item + ':' + name.value + ':' + job.type)
  name.value = item
}
function changeInfo() {
  name.value = "李四"
  age.value = 20
  job.type = "后端工程师"
  job.salary = 20000
  hobby[0] = '学习'
  console.log(name, age, job);
}
// 使用computed
let fullName = computed(() => {
  return name.value + age.value
})
// 使用watch
// watch(name, (newValue, oldValue) => {
//   console.log('sum变化了', newValue, oldValue)
// }, {immediate: true})
// watch([hobby], (newValue, oldValue) => {
//   console.log('hobby变化了', newValue, oldValue)
// }, {immediate: true, deep: true})
// 监听到哪个属性变化了   类似computed ;
// 但是computed 需要返回值
// 而watchEffect 不需要返回值 注重的函数体;
watchEffect(() => {
  let name1 = name.value
  console.log(name1)
})
// 要将响应式对象中的某个属性单独提供给外部使用时
// toRefs与toRef功能一致,但可以批量创建多个 ref 对象,语法:toRefs(person)
// shallowReactive:只处理对象最外层属性的响应式(浅响应式)。
// ——深层次的属性不做响应式;简而言之,深层次的没有办法通过get(),set()来修改对象属性。
// shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。——如果是基本数据类型,ref和shallowRef定义没有区别;如果是对象,则不做响应式处理;简而言之对象时用shallowRef定义,只做读的操作,不做写的操作。
// 什么时候使用?
//   如果有一个对象数据,结构比较深, 但变化时只是外层属性变化 ===> shallowReactive。
// 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生新的对象来替换 ===> shallowRef。
//-------------------
// 2、readOnly和shallowReadonly
// readonly: 让一个响应式数据变为只读的(深只读)。
// shallowReadonly:让一个响应式数据变为只读的(浅只读)。
// 应用场景: 不希望数据被修改时。
// shallowReadonly(person)
//
//-------------------
// 3、toRaw和markRaw
// toRaw:
// 作用:将一个由reactive生成的响应式对象转为普通对象。
// 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。
// markRaw:
// 作用:标记一个对象,使其永远不会再成为响应式对象。——简而言之,后台数据修改了,但是页面不在作渲染
// 应用场景:
//   有些值不应被设置为响应式的,例如复杂的第三方类库等。
// // 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能。
//-------------------
// 5、provide和inject
// 作用:实现祖与后代组件间通信
//
// 套路:父组件有一个provide选项来提供数据,后代组件有一个inject选项来开始使用这些数据。
// 六、新的组件
// 1、Fragment
// 在Vue2中: 组件必须有一个根标签
// 在Vue3中: 组件可以没有根标签, 内部会将多个标签包含在一个Fragment虚拟元素中
// 好处: 减少标签层级, 减小内存占用
//
// 2、Teleport
// 什么是Teleport?—— Teleport 是一种能够将我们的组件html结构移动到指定位置的技术。
// 3、Suspense
// 等待异步组件时渲染一些额外内容,让应用有更好的用户体验
// 使用步骤:
// 异步引入组件
// import {defineAsyncComponent} from 'vue'
// const Child = defineAsyncComponent(()=>import('./components/Child.vue'))
// 使用Suspense包裹组件,并配置好default与 fallback
let tableData = [
  {
    date: '2016-05-03',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-02',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-04',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles'
  },
  {
    date: '2016-05-01',
    name: 'Tom',
    address: 'No. 189, Grove St, Los Angeles'
  }
]

</script>

<template>
  <el-table
    :data="tableData"
    stripe
    style="width: 100%"
  >
    <el-table-column
      prop="date"
      label="Date"
      width="180"
    />
    <el-table-column
      prop="name"
      label="Name"
      width="180"
    />
    <el-table-column
      prop="address"
      label="Address"
    />
  </el-table>

  <div @click="changeInfo">
    {{ name }}:{{ job.type }}--{{ job.salary }}
  </div>
  <div
    v-for="(item,index) in hobby"
    :key="index"
    @click="sayHello(item)"
  >
    {{ item }}
  </div>

  {{ fullName }}
  <div>{{ type }}</div>
</template>

<style scoped lang="scss">
</style>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值