props
组合式组件 使用<script setup >
<script setup>
const props = defineProps({
title: String,
})
console.log(props.title)
</script>
<template>
<span>{{title}}</span>
</template>
组合式组件 没有使用 <script setup>
<script>
export default{
props: ['title'],
setup(props){
console.log(props.title);
}
}
</script>
选项式组件 this
<script>
export default {
props: ['foo'],
created() {
console.log(this.foo)
}
}
</script>
emits
组合式组件 使用<script setup >
<script setup>
import {ref} from 'vue'
const formValue = ref({})
const emit = defineEmits({
submit(payload: { email: string, password: string }) {
if (email && password) {
return true
} else {
console.warn('Invalid submit event payload!')
return false
}
}
})
function buttonClick() {
emit('submit', formValue.value)
}
</script>
<template>
<button @click="emit('submit', formValue)">提交</button >
</template>
组合式组件 没有使用 <script setup>
<script>
export default{
emits: ['inFocus', 'submit'],
setup(props, ctx) {
ctx.emit('submit')
}
}
</script>
选项式组件 this
<script>
export default {
data: ()=>{
return {
formValue: {}
}
},
emits: {
click: null,
submit: ({ email, password }) => {
if (email && password) {
return true
} else {
console.warn('Invalid submit event payload!')
return false
}
}
},
methods: {
submit() {
this.$emit('submit',this.formValue)
}
},
}
</script>
<template>
<button @click="$emit('submit', formValue)">提交</button >
</template>
v-model 组件数据绑定
单个model
<Child v-model="countModel" />
<script setup>
const model= defineModel()
function buttonClick() {
model.value++
}
</script>
<template>
<input v-model="model" />
<div>Parent bound v-model is: {{ model }}</div>
</template>
多个model
<Child
v-model:first-name="first"
v-model:last-name="last"
/>
<script setup>
const firstName = defineModel('firstName')
const lastName = defineModel('lastName')
</script>
实现 model 修饰符
<Child v-model.capitalize="myText" />
<script setup>
const [model, modifiers]= defineModel({
set(value){
if(modifiers.capitalize){
return value.charAt(0).toUpperCase() + value.slice(1)
}else{
return value
}
}
})
</script>
<template>
<input type="text" v-model="model" />
</template>