vue/composition-api 的使用

这篇具有很好参考价值的文章主要介绍了vue/composition-api 的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近我们项目是 vue2,但是要使用 jsx + composition ,所以来学习一下这个 vue/composition-api

(一)安装

npm install @vue/composition-api
# or
yarn add @vue/composition-api

(二)注册

在 main.ts 中

import VueCompositionAPI from '@vue/composition-api'

Vue.use(VueCompositionAPI)

(三)使用

最基本的组件:

<template>
  <div>HelloWorld</div>
</template>

<script>
import { defineComponent } from '@vue/composition-api'

export default defineComponent({
  setup() {
    
  },
})
</script>

<style scoped>

</style>

defineComponent 本身的功能很简单,但是最主要的功能是为了 ts 下的类型推导~

1. setup 函数

setup 在 create 实例在初始化之前调用(setup 函数中不存在 this)。页面上的 属性、方法要从 setup 中拿,需要 setup 中这些属性方法都 return 出去。

<template>
  <div>
    <div>{{ name }}</div>
    <div @click="sayHello">打招呼</div>
    <div @click="sayGoodBye">说再见</div>
  </div>
</template>

<script>
import { defineComponent } from '@vue/composition-api'

export default defineComponent({
  setup() {
    // 先注册
    const sayGoodBye = () => {
      console.log('sayGoodBye')
    }
    return {
      name: 'zfb',
      sayHello: () => {
        console.log(`hello,`)
      },
      sayGoodBye,
    }
  },
})
</script>

<style scoped>

</style>

2. 相应式 ref,reactive

使用 ref、reactive 可以使数据变化时,触发页面的更新。ref 处理基础类型数据,是单一的

改变的时候 改变 .value

在 @vue/composition-api 中,ref 页面模版渲染是需要 .value 的,reactive 不用

<template>
  <div>
    <div>{{ name.value }}</div>
    <div @click="changeName">改变name</div>
  </div>
</template>

<script>
import { defineComponent, ref } from '@vue/composition-api'

export default defineComponent({
  setup () {
    // 把 name 变成 响应式的 defineObjectProperty
    let name = ref('zfb')

    // 改变的时候改变 监听的 value
    const changeName = () => {
      name.value = 'zfb hello'
    }

    return {
      name,
      changeName,
    }
  },
})
</script>

<style scoped>

</style>

reactive 处理集合

<template>
  <div>
    <div>{{person.name}}</div>
    <div>{{person.age}}</div>
    <div>{{person.sex}}</div>
  </div>
</template>

<script>
import { defineComponent, reactive } from '@vue/composition-api'

export default defineComponent({
  setup () {
    // 把 person 变成 响应式的 defineObjectProperty
    let person = reactive({
      name: 'lyf',
      sex: '女',
      age: '35'
    })

    setTimeout(() => {
      person.sex = '男'
    }, 2000)

    return {
      person,
    }
  },
})
</script>

<style scoped>

</style>

对于数组:

<template>
  <div>
    <div>{{arr.value}}</div>
    <div>{{arr1.value}}</div>
    <div>{{arr2.value}}</div>
    <div>{{arr3.data}}</div>
  </div>
</template>

<script>
import { defineComponent, ref, reactive } from '@vue/composition-api'

export default defineComponent({
  setup () {
    // 把 person 变成 响应式的 defineObjectProperty
    let arr = ref(['123','456','789'])
    let arr1 = ref([1])
    let arr2 = ref([1, 2, 3])
    let arr3 = reactive({
      data: [3, 4, 5]
    })
    setTimeout(() => {
      arr.value = ['000','456','789']
      arr1.value.push(2)
      arr2.value.splice(0, 1, 4)
      arr3.data.push(7)
    }, 2000)

    return {
      arr,
      arr1,
      arr2,
      arr3
    }
  },
})
</script>

<style scoped>

</style>

readonly 只读:

<script>
import { defineComponent, ref, reactive, readonly } from '@vue/composition-api'

export default defineComponent({
  setup () {
    const original = reactive({
      countA: 0,
      foo: {
        countB: 0,
      }
    })
    const copy = readonly(original);

    original.countA++;
    copy.countA++; // 警告
    original.foo.countB++;
    copy.foo.countB++; // 警告

    console.log(original.countA); // 2
    console.log(copy.countA); // 2
    console.log(original.foo.countB); // 2
    console.log(copy.foo.countB); // 2
  }
})
</script>

<style scoped>

能修改 但是会警告

3. toRefs

<template>
  <div>
    <!-- 变成了 ref 需要.value
    但是如果在 vue3 中不用 -->
    <div>{{ name.value }}</div>
    <div>{{ age.value }}</div>
    <div>{{ sex.value }}</div>
  </div>
</template>

<script>
import { defineComponent, reactive, toRefs } from '@vue/composition-api'

export default defineComponent({
  setup () {
    // 把 person 变成 响应式的 defineObjectProperty
    let person = reactive({
      name: 'lyf',
      sex: '女',
      age: '35'
    })

    setTimeout(() => {
      person.sex = '男'
    }, 2000)

    // 解构的时候都转换成 ref 的形式
    // 不然不具备响应式
    const { name, sex, age } = toRefs(person)

    return {
      name, sex, age
    }
  },
})
</script>

<style scoped>

</style>

4. toRef

toRefs 改变的时候,对象上面是有属性的,但是不排除对象上面一开始没有这个属性的情况,这个时候就需要用到 toRef

没有使用 toRef 的时候:

<template>
  <div>
    <!-- 变成了 ref 需要.value
    但是如果在 vue3 中不用 -->
    <div>{{ name.value }}</div>
    <div>{{ age.value }}</div>
    <div>{{ sex.value }}</div>
    <div>{{ sex.hobby }}</div>
  </div>
</template>

<script>
import { defineComponent, reactive, toRefs } from '@vue/composition-api'

export default defineComponent({
  setup () {
    // 把 person 变成 响应式的 defineObjectProperty
    let person = reactive({
      name: 'lyf',
      sex: '女',
      age: '35'
    })

    // 解构的时候都转换成 ref 的形式
    const { name, sex, age, hobby } = toRefs(person)

    // 刚开始没有 hobby 但是后来又有了
    // 这个时候发现页面上 2s 之后是不会出现hobby的
    setTimeout(() => {
      person.hobby = 'ch'
    }, 2000)


    return {
      name, sex, age, hobby
    }
  },
})
</script>

<style scoped>

</style>

使用 toRef

<template>
  <div>
    <!-- 变成了 ref 需要.value
    但是如果在 vue3 中不用 -->
    <div>{{ name.value }}</div>
    <div>{{ age.value }}</div>
    <div>{{ sex.value }}</div>
    <div>{{ hobby.value }}</div>
  </div>
</template>

<script>
import { defineComponent, reactive, toRef, toRefs } from '@vue/composition-api'

export default defineComponent({
  setup () {
    // 把 person 变成 响应式的 defineObjectProperty
    let person = reactive({
      name: 'lyf',
      sex: '女',
      age: '35'
    })

    // 解构的时候都转换成 ref 的形式
    const { name, sex, age, } = toRefs(person)

    // 针对原本对象上没有的情况
    let hobby = toRef(person, 'hobby')

    // 刚开始没有 hobby 但是后来又有了
    // 这个时候发现页面上 2s 之后会出现hobby的
    setTimeout(() => {
      hobby.value = 'ch'
    }, 2000)


    return {
      name, sex, age, hobby
    }
  },
})
</script>

<style scoped>

</style>

但是还是建议,初始化的时候,给一个空的文章来源地址https://www.toymoban.com/news/detail-447680.html

 let person = reactive({
      name: 'lyf',
      sex: '女',
      age: '35',
      hobby: ''
    })

到了这里,关于vue/composition-api 的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【vue3】11-Vue 3中的Composition Api(一)

    在Vue2中,我们编写组件的方式是Options APl: Options API的一大特点就是在 对应的属性 中编写 对应的功能模块 ; 比如 data定义数据 、 methods中定义方法 、 computed中定义计算属性 、 watch中监听属性改变 ,也包括 生命周期钩子 ; 但是这种代码有一个很大的弊端: 当我们 实现某一个功

    2024年02月08日
    浏览(40)
  • 从Vue2到Vue3【一】——Composition API(第一章)

    内容 链接 从Vue2到Vue3【零】 Vue3简介 从Vue2到Vue3【一】 Composition API(第一章) 从Vue2到Vue3【二】 Composition API(第二章) 从Vue2到Vue3【三】 Composition API(第三章) 从Vue2到Vue3【四】 Composition API(第四章) Vue3作为Vue.js框架的最新版本,引入了许多令人激动的新特性和改进。其

    2024年02月16日
    浏览(30)
  • Vue Composition API之侦听器watch/watchEffect

    在日常的开发中,很多时候我们需要去对一些状态进行监听,比如当显示学生的成绩列表时,我们使用一个学生的学号student_num作为请求成绩的参数,如果没有监听机制,当学号student_num改变时,我们需要依赖用户的操作去刷新成绩。但是有了侦听器,我们可以通过侦听器去监

    2024年02月08日
    浏览(41)
  • 从Vue2到Vue3【四】——Composition API(第四章)

    内容 链接 从Vue2到Vue3【零】 Vue3简介 从Vue2到Vue3【一】 Composition API(第一章) 从Vue2到Vue3【二】 Composition API(第二章) 从Vue2到Vue3【三】 Composition API(第三章) 从Vue2到Vue3【四】 Composition API(第四章) 从Vue2到Vue3【五】 从Vue2到Vue3【五】——新的组件(Fragment、Teleport、S

    2024年02月16日
    浏览(39)
  • 从Vue2到Vue3【三】——Composition API(第三章)

    内容 链接 从Vue2到Vue3【零】 Vue3简介 从Vue2到Vue3【一】 Composition API(第一章) 从Vue2到Vue3【二】 Composition API(第二章) 从Vue2到Vue3【三】 Composition API(第三章) 从Vue2到Vue3【四】 Composition API(第四章) 随着Vue 3的发布,我们迎来了一套强大且令人兴奋的 组合式API ,这为开

    2024年02月16日
    浏览(43)
  • 从Vue2到Vue3【二】——Composition API(第二章)

    内容 链接 从Vue2到Vue3【零】 Vue3简介 从Vue2到Vue3【一】 Composition API(第一章) 从Vue2到Vue3【二】 Composition API(第二章) 从Vue2到Vue3【三】 Composition API(第三章) 从Vue2到Vue3【四】 Composition API(第四章) Vue3作为Vue.js框架的最新版本,引入了许多令人激动的新特性和改进。其

    2024年02月17日
    浏览(39)
  • 556、Vue 3 学习笔记 -【常用Composition API(五)】 2023.08.25

    Vue3中可以继续使用Vue2中的生命周期钩子,但有两个被更名: beforeDestroy改名为beforeUnmount destroy改名为unmounted Vue3也提供了组合式API形式的生命周期钩子,与Vue2中钩子对应关系如下: beforeCreate === setup() created === setup() beforeMount === onBeforeMount mounted === onMounted beforeUpdate === onBefor

    2024年02月11日
    浏览(38)
  • 557、Vue 3 学习笔记 -【常用Composition API(六)】 2023.09.05

    1. shallowReactive 与 shallowRef shallowReactive:只处理对象最外层属性的响应式(浅响应式)。 shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理。 什么时候使用? 如果有一个对象数据,结构比较深,但变化时只是外层属性变化 === shallowReactive 如果有一个对象数据,后

    2024年02月10日
    浏览(36)
  • 探究Vue3中的Composition API:优化组件逻辑的新利器

    在 Vue 3.0 中,引入了一种新的响应式 API,即 toRef 。 toRef 函数可以将一个普通值转换为响应式引用类型,这样就可以在模板中直接使用这个响应式引用类型的属性,并且当该属性发生变化时,视图会自动更新。 通过控制台打印输出的内容和页面的变化,我们可以观察到,age的

    2024年02月10日
    浏览(35)
  • Composition API 的优势、新的组件(Fragment,Teleport,Suspense)【Vue3】

    使用传统OptionsAPI中,新增或者修改一个需求,就需要分别在data,methods,computed里修改。 我们可以更加优雅的组织我们的代码,函数。让相关功能的代码更加有序的组织在一起。 在Vue2中:组件必须有一个根标签 在Vue3中:组件可以没有根标签,内部会将多个标签包含在一个

    2024年02月02日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包