Vue3.0-beta composition API note

介绍

基于option的Vue2.x当代码量足够多时很难区分不同的逻辑,混作一团,基于composition的组织型结构能够很好的区分不同的处理逻辑,并且能够很好的达到复用的目的,类似React Hook(useHandle),composition API 不存在this,省去了很多麻烦。

Vue3.0在语法上与Vue2.x相比没有改变,改变的是API,准确的说就是引入Composition API

更多:

  • 增加Tree shaking,按需引入,包更加的小
  • 连续的静态节点,直接使用字符串拼接,innerHTML的形式进行渲染,性能更好

setup

setup可以用作所有组合函数的入口点,setup只会被调用一次,这点与React Hook不同

ref和reactive

ref等同于reactive,引入ref是为了是JavaScript中参数的传递是值的传递而不是引用的传递(计算的返回值可能是基本类型,所以不可避免的需要引入ref),如果直接返回基本变量,则返回后将失去对其的追踪。ref实际是一个对象,value值为值,这样就可以保存对变量的引用,从而可以拦截对.value属性的getter和setter等,从而执行依赖追踪和更改操作。

Vue对渲染ref时对渲染上下文做了特殊处理,以至于在模板语法中不需要使用ref.value的形式获取值,在实际生产中可以将ref变量命名约定使用xxxRef的形式,与普通对象进行区分

reactive的缺陷在于,你始终需要始终保持对返回对象的引用,如下

// 这种情况下将会失去reactive,这不是返回对象
return {...usePosition()}
// 保持reactive的唯一方法是继续使用pos,引用pos.x,pos.y,useMousePosition()是真正的返回对象
return {
      pos: useMousePosition()
    }
<template>
  <img src="./logo.png">
  <h1>Hello Vue 3!</h1>
  <h1>pageX:{{pos.x}}</h1>
  <h1>pageY:{{pos.y}}</h1>
</template>

<script>
import { ref, onMounted, onUnmounted, reactive } from 'vue'

export default{
  setup(){
    // const {x,y} = usePosition();
    return {
      pos:usePosition()
    };
  }
}

function usePosition(){

    const pos = reactive({
      x:0,
      y:0
    })
    onMounted(()=>window.addEventListener('mousemove',update));
    onUnmounted(()=>window.removeEventListener('mousemove',update));
    function update(e){
      pos.x = e.pageX;
      pos.y = e.pageY;
    }
    return pos;
}

</script>

<style scoped>
img {
  width: 200px;
}
h1 {
  font-family: Arial, Helvetica, sans-serif;
}
</style>

或者将其转化为ref,使用toRefsAPI,将对象上的每个属性转化到对应的ref上

<template>
  <img src="./logo.png">
  <h1>Hello Vue 3!</h1>
  <h1>pageX:{{x}}</h1>
  <h1>pageY:{{y}}</h1>
</template>

<script>
import { ref, onMounted, onUnmounted, reactive, toRefs } from 'vue'

export default{
  setup(){
    const {x,y} = usePosition();
    return {
      x,y
    };
  }
}

function usePosition(){

    const pos = reactive({
      x:0,
      y:0
    })
    onMounted(()=>window.addEventListener('mousemove',update));
    onUnmounted(()=>window.removeEventListener('mousemove',update));
    function update(e){
      pos.x = e.pageX;
      pos.y = e.pageY;
    }
    return toRefs(pos);
}

</script>

与React Hooks的比较

  • 对顺序没有要求,可以条件性的执行hook,React中hook的执行机制是顺序执行的,当其中一环丢失时可能造成后边的hook失效
  • 每次渲染不重复调用,React在每次渲染都会调用
  • 不需要考虑hook中的useCallback导致的子组件重复渲染问题
  • 不存在useMemouseEffect没有正确传递依赖数组的问题,Vue会自动判断依赖关系
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3.0中的组件高级功能包括保持动态组件状态和引用DOM元素。 保持动态组件状态的方法是使用Vue内置的<keep-alive>组件。通过将动态组件包裹在<keep-alive>标签中,可以在切换动态组件时保持组件的状态。例如: ```html <keep-alive> <component :is="comName"></component> </keep-alive> ``` 在这个例子中,comName是一个data属性,用于指定当前要渲染的组件的名称。通过在<component>标签中使用:is属性,可以动态地指定要渲染的组件。 引用DOM元素的方法是使用ref属性。通过给DOM元素添加ref属性,可以在组件中通过$refs属性获取对DOM元素的引用。例如: ```html <template> <h3>MyRef组件</h3> <button @click="getRef">获取$refs引用</button> </template> <script> export default { methods: { getRef() { console.log(this.$refs) // $refs指向一个空对象,需要在DOM元素上添加ref属性 } } } </script> ``` 在这个例子中,点击按钮后,调用getRef方法可以在控制台上输出当前组件实例对象this。通过this.$refs可以访问到DOM元素的引用。 以上就是Vue3.0中组件高级功能的两个示例,分别是保持动态组件状态和引用DOM元素。希望能对你有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Vue3.0----组件高级【下】(第五章)](https://blog.csdn.net/QQ675396947/article/details/127486948)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值