Vite 命令
$ npm init vite-app
$ yarn create vite-app
等价于
$ yarn global add create-vite-app 然后cva
等价于
$ npx createa-vite-app
//或
$ pnpm create vite <project-name> -- --template vue
Setup()
- setup() 函数是 vue3 中,专门为组件提供的新属性。它为我们使用 vue3 的 Composition API 新特性提供了统一的入口。 setup 函数会在 beforeCreate 之后、created 之前执行。
- setup是一个新的组件选项,也是其他API的入口。 所有的操作都将在setup函数内部定义和执行, Vue3.0也将用函数代替Vue2.x的类也就是new Vue()
setup
函数中的第一个参数是props
参数。setup
函数中的props
是响应式的,当传入新的 prop 时,它将被更新。- 传递给
setup
函数的第二个参数是context
。context
是一个普通的 JavaScript 对象,它暴露三个组件 property。// MyBook.vue
export default {
setup(props, context) {
// Attribute (响应式 object)
console.log(context.attrs)
// Slots (响应式 object)
console.log(context.slots)
// Emit 事件 (方法)
console.log(context.emit)
}
}
Ref()
ref
是Composition API 引入的新概念。作用是使访问响应式的变量不依赖于实例的this
。如果使用了ref
,我们访问响应式的变量时使用.value
而不是从this
中获取,其底层是采用reactive
方法实现。ref
会返回一个可变的响应式对象,该对象作为它的内部值——一个*响应式的引用,这就是名称的来源。此对象只包含一个名为 value
的 property` :
import { ref } from 'vue'
const count = ref(0)
console.log(count.value) // 0
count.value++
console.log(count.value) // 1
v-model文档
在 3.x 中,自定义组件上的 v-model
相当于传递了 modelValue
prop 并接收抛出的 update:modelValue
事件:
<ChildComponent v-model="pageTitle" />
<!-- 简写: -->
<ChildComponent
:modelValue="pageTitle"
@update:modelValue="pageTitle = $event"
/>
$event 的值是 emit 的第二个参数
emit(事件名, 事件参数)
<Switch :value="y" @update:value="y = $event"/>
可以简写为
<Switch v-model:value="y" />
------------
setuop(props,context){
const toggle = () => {
context.emit('init', !props.value)
}
return {toggle}
}
Vue 3 属性绑定
默认所有属性都绑定到根元素
使用 inheritAttrs: false 可以取消默认绑定
使用 $attrs 或者 context.attrs 获取所有属性
使用 v-bind=”$attrs” 批量绑定属性
使用 const {yyy, xxx, …rest} = context.attrs 将属性分开
props V.S. attrs
props 要先声明才能取值,attrs 不用先声明
props 不包含事件,attrs 包含
props 没有声明的属性,会跑到 attrs 里
props 支持 string 以外的类型,attrs 只有 string 类型
onMount 和 onUpdate 可以用 watchEffect代替
const count = ref(0)
watchEffect(() => console.log(count.value))
// -> logs 0
setTimeout(() => {
count.value++
// -> logs 1
}, 100)
如果在onMounted之前不更新可以用onMounted套起来
onMounted(() => {
watchEffect(() => {
// access the DOM or template refs
})
})
Vue 2 和 Vue 3 的小区别
- Vue 3 的 Template 支持多个根标签,Vue 2 不支持
- Vue 3 有 createApp(),而 Vue 2 的是 new Vue()
- createApp(组件),new Vue({template, render})
- 新 v-model 代替以前的 v-model 和 .sync 新增
- context.emit(setup里使用),与 this.$emit 作用相同(methods里写)