当前位置: 首页 > news >正文

专业摄影网站/网站建设找哪家好

专业摄影网站,网站建设找哪家好,58同城网站模板下载,虚拟机安装wordpress常用的 Composition API(组合API) setup Vue3.0新增的配置项,值为一个函数setup是所有Composition API的组件中所用到的:数据,方法等等,均需要配置在setup函数中setup函数的两种返回值: 若返回…

常用的 Composition API(组合API)

setup

  1. Vue3.0新增的配置项,值为一个函数
  2. setup是所有Composition API的
  3. 组件中所用到的:数据,方法等等,均需要配置在setup函数中
  4. setup函数的两种返回值:
    • 若返回是一个对象,对象中的属性,方法,在模板中均可以直接使用
    • 若返回一个渲染函数,则可以自定义渲染内容
  5. setup的两个注意点:
    • setup的执行时机:在beforeCreate之前执行一次,this是undefined
    • setup的参数:
      • props:值为对象,包含外部传递过来,且组件内部申明接收了的属性
      • context:上下文对象
        • attrs:值为对象,包含组件外部传递过来,但是没有在props中配置中申明的属性,相当于this.$attrs
        • slots:收到的插槽的内容,相当于this.$slots
        • emit:分发自定义时间的函数,相当于this.$emit。(值得注意的是,Vue3中使用emit,需要使用emits去接收父组件传过来的数据,和props
          差不多)
PS:
  1. 尽量不要与Vue2的配置项混用:
    • Vue2配置项(data,methods,computed…)中可以访问到setup中的属性,方法。
    • 但在setup中不能访问到Vue2中的配置
    • 如果有重名,setup优先
  2. setup函数不能是一个async函数(后面学习异步组件,也行,需要的是Suspense和异步组件引入的配合),因为返回值不在是一个return的对象,而是promise,模板看不到return对象中的属性
<template><h1>{{name}}</h1><button @click="sayHi"></button>
</template>
<script>
exprot default {name: 'App',setup(props,context) {const name = "景天" // 不是响应式的数据function sayHi() {console.log(`Hi,我是${name}`)}// 返回值是一个对象return {name,sayHi}// 返回值是一个渲染函数return () => h('h1','这是渲染函数渲染的内容')}
}
</script>

ref函数

  1. 作用:定义一个响应式的数据,或者说是生成一个引用实现对象
  2. 语法:const xxx = ref(initValue)
    • 创建一个包含响应式数据的引用对象(reference对象)
    • JS中操作数据需要:xxx.value
    • 模板中读取数据:直接使用即可
PS:
  1. ref接收的数据可以是基本类型数据,也可以是对象类型
  2. 基本类型的数据:响应式是靠Object。defineProperty()的get和set完成的
  3. 对象类型的数据:内部使用了reactive函数
<template><h1>{{name}}</h1><h1>{{age}}</h1><button @click="sayHi"></button>
</template>
<script>
import {ref} from 'vue'
exprot default {name: 'App',setup() {const name = ref("景天") const age = ref(18) const job = ref({type: '前端',money:'30K'}) // 其实Vue3帮你调用了reactive函数// 在setup中访问ref定义的基本数据类型的数据,需要 .value才能拿到值function sayHi() {name.value = '飞蓬'age.value = '1000'job.value.money = '60K'}return {name,age,job,sayHi}}
}
</script>

reactive函数

  1. 作用:定义一个对象类型的响应式数据
  2. 语法:const 代理对象 = reactive(源对象) 参数是一个对象或者数组,返回一个代理对象(Proxy的实例对象,简称proxy对象)
  3. reactive定义的响应式数据是深层次的
  4. 内部基于ES6的Proxy实现,通过代理对象操作源对象内部数据
<template><h1>{{name}}</h1><h1>{{age}}</h1><button @click="sayHi"></button>
</template>
<script>
import {ref, reactive} from 'vue'
exprot default {name: 'App',setup() {const name = ref("景天") const age = ref(18) const job = reactive({type: '前端',money:'30K'}) const hobby = ['抽烟', '喝酒', '烫头']function sayHi() {name.value = '飞蓬'age.value = '1000'job.money = '60K'   // 不需要.value了hobby[0] = '吃饭'}return {name,age,job,hobby,sayHi}// ref定义的基本类型的数据都要.value取值,有点烦,我们可以换一种思路,而且语义化const person = reactive({name: '景天',age: 18,jon: {type: '前端',money:'30K'},hobby: ['抽烟', '喝酒', '烫头']})return {person}}
}
</script>

computed

简写和完整版写法和Vue2都一样,只是使用不一样,需要单独引入使用,变成了一个函数

<template><h1><input v-model="firstName" /></h1><h1><input v-model="lastName" /></h1><div>{{fullName}}</div>
</template>
<script>
import {reactive,computed} from 'vue'
exprot default {name: 'App',setup() {const person = reactive({firstName + : '景天',lastName: 18,})// 或者可以绑定在person对象上// person.fullName = computed(()=>{let fullName = computed(()=>{// 简写形式,完整版的get和set和Vue2都一样return person.firstName + person.lastName})return {person,fullName}}
}
</script>

watch

  • 和Vue2基本相似,配置是一样的
  • 两个坑:
    • 监视reactive定义的响应式数据时:oldVal无法正确的获取,强制开启了深度监视(deep配置无效)
    • 监视reactive定义的响应式数据中的某个属性(对象)时:deep配置有效
<template><h1>{{num}}</h><h1>{{msg}}</h>
</template>
<script>
import {ref,reactive,watch} from 'vue'
exprot default {name: 'App',setup() {let num = ref(0)let msg= ref('消息')let p = reactive({name: '景天',age: 18,a: {b: {c: 100}}})// 1. 监视ref所定义的一个响应式数据watch(num,(newVal,oldVal)=> {console.log(newVal,oldVal)},{immediate:true})// 2. 监视ref所定义的多个响应式数据watch([num,msg],(newVal,oldVal)=> {console.log(newVal,oldVal)},{immediate:true})// 3. 监视reactive所定义的一个响应式数据。// 注意:此处无法正确的获得oldVal// 注意:强制开启了深度监视器(deep配置无效)watch(p,(newVal,oldVal)=> {console.log(newVal,oldVal)},{deep:false}) // 此处的deep无效// 4. 监视reactive所定义的一个响应式数据中的某个属性。需要使用函数watch(()=>p.name,(newVal,oldVal)=> {console.log(newVal,oldVal)})// 5. 监视reactive所定义的一个响应式数据中的某些属性。watch([()=>p.name,()=>p.age],(newVal,oldVal)=> {console.log(newVal,oldVal)},{deep:false})// 特殊情况watch(()=>p.a,(newVal,oldVal)=> {console.log(newVal,oldVal)},{deep:true})      // 此处由于监视的是reactive所定义的对象中的某个属性(对象),所以deep配置有效return {num,msg,p}}
}
</script>

watchEffect函数

  • watch:需要指明监视的属性,也要指明监视的回调
  • watchEffect:不需要指明监视哪个竖向,监视的回调中用到哪个属性,就监视那个属性
  • watchEffect有点类似于computed:
    • computed注重的是计算出来的值,所以必须写返回值
    • watchEffect更注重的是过程,所以不需要写返回值
<template><h1>{{num}}</h><h1>{{msg}}</h>
</template>
<script>
import {ref,reactive,watchEffect} from 'vue'
exprot default {name: 'App',setup() {let num = ref(0)let msg= ref('消息')let p = reactive({name: '景天',age: 18,a: {b: {c: 100}}})watchEffect(()=> {const x1 = sum.valueconst x2 = age.valueconsole.log('watchEffect调用了')})return {num,msg,p}}
}
</script>

toRef

  • 作用:创建一个ref对象,其value值指向另一个对象中的某个属性,这样才是响应式的
  • 语法:const name = toRef(person,'name')
  • 应用:要将响应式对象中的某个属性单独提供给外部使用
  • 扩展:toRefs和toRef功能一直,但是可以批量创建多个ref对象,语法toRefs(person)
// 上面说过数据可以定义reactive,避免.value。但是这样的话,我们使用数据就要person.name这样使用,那么可以试试这样
return {...toRefs(person)
}

其他Composition API

shallowReactive和shallowRef

  • shallowReactive:值处理对象最外层属性的响应式(浅响应式)
  • shallowRef:只处理基本数据类型的响应式,处理基本类型数据,和ref没有区别,不进行对象的响应式处理
  • 什么时候使用?
    • 如果有一个对象数据,结构比较浅,但变化时只是外层属性变化,使用shallowReactive
    • 如果有一个对象数据,后续功能不会修改该对象中的属性,而是生成新的对象来替换,使用shallowRef

readonly和shallowReadonly

  • readonly:让一个响应式数据变为只读(深只读)
  • shallowReadonly:让一个响应式数据变为只读(浅只读),只是最外层属性值不让改
  • 使用场景:不希望数据被改变时,比如别人定义的数据,你使用,但是改了对别人有影响,你在使用的时候可以先使用readonly(person),这样就不怕被改了。

toRaw和markRaw

  • toRaw:
    • 作用:将一个由reactive生成的响应式对象转换为普通对象。toRaw(person)
    • 场景:用于读取响应式对象对应的普通对象,对于这个普通对象的所有操作,不会引起页面的更新
  • markRaw
    • 作用:标记一个对象,使其永远不会再成为响应式对象
    • 场景:
      1. 有些值不应该被设置为响应式的,如第三方库
      2. 当渲染具有不可变数据的大列表时,跳过响应式转换可以提高性能

customRef

  • 作用:创建一个自定义的ref,并对其依赖项跟踪和更新触发进行显式控制。
demo:实现输入数据,防抖效果
<template><input v-model="keyword"><div>{{keyword}}</div>
</template><script>import { customRef } from 'vue'export default {name: 'demo',setup() {// 自定义一个ref,名称为myReffunction myRef(value,delay) {let timer// 使用vue的customRef去配置我们的myRef,参数为一个函数,这个函数有两个参数可以直接使用// track:// trigger:return customRef((track,trigger)=> {// 要求必须返回一个对象,里面包含get和setreturn {get() {// 通知vue追踪value的变化track()return value},set(neValue) {clearTimeout(timer)timer = setTimeout(()=> {value = newValue// 通知vue去重新解析模板trigger()},delay)}}})}}let keyword = myRef('Hello',100)return {keyword}}
</script>

provide和inject在Vue3中的使用

  • 作用:实现祖孙组件间通信,即父组件定义,后面所有子代组件都能用
  • 套路:父组件有一个provide选项来提供数据,后代组件有一个inject选项来开始使用这些数据
// 祖组件
import {reactive} from 'vue'
setup() {let car = reactive({name: '奥迪',price: '100W'})provide('car',car)
}
// 后代组件
import {inject} from 'vue'
setup(props,context) {const car = inject('car')return {car}
}

响应式数据的判断

  • isRef: 检查一个值是不是一个ref对象
  • isReactive: 检查一个对象是不是由reactive创建爱你的响应式代理
  • isReadonly: 检查一个对象是不是由readonly创建的只读代理
  • isProxy: 检查一个对象是否是由ractive或者readonly方法创建的代理

Vue3中的新组件

Fragment

相当于一个虚拟的容器,在Vue中,每个组件,都需要有个根组件,但是在Vue3不需要,其实是Vue3帮助我们调用了这个组件,在我们的页面上,不会渲染出来

Teleport

当我们的组件总有些内容,不想显示在我们自己的组件中,可以使用这个组件,比如我们有个弹窗,想显示在body标签中

// to这里支持标签
// to支持css标签
// <teleport to="body">
<teleport to="#main"><div class="dialog">这是一个对话框</div>
</teleport>

Suspense

试验性

Suspense 是一个试验性的新特性,其API可能随时会发生变动。特此声明,以便社区能够为当前的实现提供反馈。

生产环境请勿使用。

以上是官方的警告!

  • 等待异步组件渲染一些额外的内容,让应用有更好的用户体验
  • <suspense> 组件有两个插槽。它们都只接收一个直接子节点。default 插槽里的节点会尽可能展示出来。如果不能,则展示 fallback 插槽里的节点。
  • 这里就是之前说到setup的时候提到的,setup的返回值不能使用异步,但是如果像下面这样使用异步函数引入子组件,那么子组件就可以使用异步了,像Promise。
<template><div><Suspense>// 这两个插槽名称是固定的// defalut:这里面写的就是我们正常要显示的组件和代码// fallback:这里写的就是应急代码,就是正常代码没有显示的时候的代码<template v-slot:defalut:><Child/></template><template v-slot:fallback><div>加载中...</div></template></Suspense></div>
</template><script>// import Child from './component/Child.vue' // 平时使用的静态引入// 下面这是异步引入import { defineAsyncComponent } from 'vue'const Child = defineAsyncComponent(()=> import('./component/Child.vue'))export default {name: 'app',components: {Child}setup() {}}
</script>
http://www.jmfq.cn/news/5061709.html

相关文章:

  • 网站建设 肥城/搜索引擎哪个最好用
  • 深圳疫情最新消息今天新增病例/seo外包费用
  • tech域名可以做网站吗/seo神器
  • windows 做网站服务器/百度认证服务平台
  • 药品企业网站域名证书办理/南宁网络推广培训机构
  • 网站建设建站经验/网络关键词优化方法
  • 电子商务网站建设训练总结/企业qq官网
  • 栾城做网站/网络营销顾问招聘
  • 专业直播网站开发/百度广告联盟官网
  • 单位网站 方案/手机关键词排名优化
  • 如何将网站的关键词排名优化/百度云搜索引擎网站
  • 地铁网站建设特点/qq引流推广平台
  • 广告牌制作报价单明细/西安seo优化公司
  • 大丰做网站的公司/自己怎么建网站
  • 手机网站html5模板/百度广告联盟价格
  • 服装外贸网站建设/网站开发外包
  • 网站建设与管理怎么样/郑州网站建设用户
  • 做网站好做吗/软文写作是什么意思
  • 山东省建设工程造价管理协会网站/百度竞价排名价格
  • web软件设计专业/seo教程seo官网优化详细方法
  • 网站后台表格/电商网站对比
  • 南京网站建设一条龙/外贸推广优化公司
  • 快速网站优化服务/ds2600ii色带
  • wordpress图片无法居中显示/seo sem是什么
  • 长春专业企业网站建设工作室/推广下载app赚钱
  • 网站开发北京/上海搜索引擎关键词优化
  • 青岛的网站建设/seo入门培训教程
  • 霸州做网站shijuewang/百度搜索推广官网
  • 广州开发区建设和环境保护局网站/除了小红书还有什么推广平台
  • 专业做生鲜的网站/seo科技网