自由自由,多少罪恶假汝之名以行。——罗兰夫人
这个思想上有点类似流程控制框架,将一个组件中的多个关注点分离、抽取,然后能进一步复用、编排
官方文档:https://v3.cn.vuejs.org/guide/composition-api-introduction.html#介绍
使用上来讲,就是编写的api
方式变了,举个例子:
下面是我实际写的一个小组件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| <script lang="tsx"> interface Props { msg: string; msgModifiers: { [key: string]: boolean; }; } import { computed, onMounted, ref, Ref, toRefs, watch, } from 'vue' export default { props: { msg: { type: String } }, // 新的 setup 选项在组件被创建之前执行,一旦 props 被解析完成,它就将被作为组合式 API 的入口。 setup(props: Props, { expose, emit }) { // ref 接收参数并将其包裹在一个带有 value property 的对象中返回,然后可以使用该 property 访问或更改响应式变量的值: const count: Ref<number> = ref(0) // 使用 `toRefs` 创建对 `props` 中的 `msg` property 的响应式引用 const { msg } = toRefs(props) // 定义方法 const increment = (event: MouseEvent) => ++count.value // 生命周期mounted onMounted(() => { console.log('mounted', { count }) }) // 监听 watch(count, (newValue) => { if (count.value > 10) { count.value = 0 } console.log('count changed', { newValue }) }) // 计算 const twiceTheCounter = computed(() => count.value * 2) // 暴露方法,其中定义的 property 将可以被外部组件实例访问 expose({ increment }) // setup 还可以返回一个渲染函数,该函数可以直接使用在同一作用域中声明的响应式状态: return () => ( <div> <div>{msg.value}</div> <p>You clicked {count.value} times</p> <p>{twiceTheCounter.value}</p> <button onClick={increment}>Click me</button> </div> ) } } </script>
<style scoped> a { color: #42b983; } </style>
|