📅  最后修改于: 2023-12-03 14:52:37.414000             🧑  作者: Mango
在 Vue 中更新组件的 props 是非常常见的需求。有时我们需要更新 props 的同时执行某些逻辑,这时候我们可以使用函数来实现。
在 Vue 2 中,我们可以使用 v-once 来让一个组件只渲染一次。当后续的 props 更新时,我们可以在组件的 created 生命周期中执行处理函数并将处理结果储存在一个变量中,随后在组件中使用该变量来渲染对应内容。
<template>
<div>
<p>这里是组件内容: {{ myData }}</p>
<button @click="updateProps">点击更新 Props</button>
</div>
</template>
<script>
export default {
// 通过 v-once 将组件设置为只渲染一次
// ESLint 可能会对此抱怨,请自行处理
// eslint-disable-next-line vue/no-unused-components
components: {
ChildComponent
},
props: {
someData: {
type: String,
required: true
}
},
created() {
// 在 created 生命周期中执行处理函数
this.myData = this.handleProps(this.someData)
},
methods: {
// 处理 props 的函数
handleProps(data) {
// 处理逻辑
return 'newData'
},
// 更新 props 的函数
updateProps() {
this.someData = 'newProps'
// 在更新 props 后修改变量,并触发重新渲染
this.myData = this.handleProps(this.someData)
}
},
data() {
// 在 data 中声明变量
return {
myData: ''
}
}
}
</script>
在 Vue 3 中,我们可以使用 watch 来监听 props 的变化。当 props 变化时,我们可以在回调函数中执行处理函数,并将处理结果储存在一个 ref 或 reactive 变量中,随后在组件中使用该变量来渲染对应内容。
<template>
<div>
<p>这里是组件内容: {{ myData }}</p>
<button @click="updateProps">点击更新 Props</button>
</div>
</template>
<script>
import { watch, reactive } from 'vue'
export default {
props: {
someData: {
type: String,
required: true
}
},
setup(props) {
// 在组件 setup 中声明 ref 或 reactive 变量
const myData = reactive({ value: '' })
// 使用 watch 监听 props 的变化,并在回调函数中执行处理函数
watch(() => props.someData, (newVal) => {
myData.value = handleProps(newVal)
})
// 处理 props 的函数
function handleProps(data) {
// 处理逻辑
return 'newData'
}
// 更新 props 的函数
function updateProps() {
props.someData = 'newProps'
}
// 返回组件的属性和方法
return {
myData,
updateProps
}
}
}
</script>
无论是 Vue 2 还是 Vue 3,我们都可以使用函数来实现在更新 props 的同时执行逻辑的需求。需要注意的是,在 Vue 2 中,我们需要使用 v-once 将组件设置为只渲染一次,而在 Vue 3 中,我们可以使用 watch 来监听 props 的变化。