Vue3组件化 | 青训营笔记

98 阅读2分钟

这是我参与「 第五届青训营 」伴学笔记创作活动的第 8 天

Vue3组件化

一、事件定义

1、定义组件的时候使用驼峰命名法定义事件名,比如在MyComponent中

emit('someEvent')

2、在使用组件的时候,使用肉串方式使用

<MyComponent @some-event="callback" />

二、透传特性

1、在vue3中,那些没有明确在组件props和emits中声明的特性或事件监听器称为透传特性,以前叫做非属性特性。比如class、style、id等等。当组件只有单根时,透传特性自动被添加到根元素上作为其特性。归到$attr里,以class为例

<MyButton class="large"></MyButton>

class透传到组件内

<button class="large">按钮</button>

2、不想自动继承怎么办,在组件内添加一个新的script

<script>
export default {
    inheriAttrs: false
  }
</script>

3、怎么获取所有透传特性?使用useAttrs

import { useAttrs } from 'vue'
const attrs = useAttrs()

三、提供/注入:provide/inject

1、隔代传惨时,使用provide/inject这组API,不推荐使用pinia、vuex进行状态管理

2、使用

祖代提供数据,传给后代 第一个参数是key 第二个参数是值

provide('key', 'value')

在后代中,使用inject注入数据 第一个参数是key 第二个参数是如果没有传进来值就给一个default默认值

inject('key', 'default')

四、Composables

1、利用Composables API封装的可复用状态逻辑称为Composables,类似于react当中的hooks

约定composables函数命名时加上use前缀

2、例子:unrefs

如果参数是 ref,则返回内部值,否则返回参数本身。

这是 val = isRef(val) ? val.value : val 计算的一个语法糖。

function useFoo(x: number | Ref<number>) {
  const unwrapped = unref(x)
  // unwrapped 现在保证为 number 类型
}

五、组件通信

1、props

Props方式是Vue中最常见的一种父传子的一种方式,使用也比较简单。

根据上面的demo,我们将数据以及对数据的操作定义在父组件,子组件仅做列表的一个渲染;

父组件代码如下:

<child-components :list="list"></child-components>

子组件只需要对父组件传递的值进行渲染即可,代码如下:

<script setup>
import { defineProps } from 'vue'
const props = defineProps({
  list: {
    type: Array,
    default: () => [],
  },
})
</script>

2、emit

emit方式也是Vue中最常见的组件通信方式,该方式用于子传父

根据上面的demo,我们将列表定义在父组件,子组件只需要传递添加的值即可。

子组件代码如下:

<script setup>
import { ref, defineEmits } from 'vue'
const value = ref('')
const emits = defineEmits(['add'])
const handleSubmit = () => {
  emits('add', value.value)
}
</script>

在子组件中点击【添加】按钮后,emit一个自定义事件,并将添加的值作为参数传递。

父组件代码如下:

<child-components @add="handleAdd"></child-components>
const handleAdd = () => {}