今天遇到三个问题,都没解决,有没有懂得看看,指点我一二
我贴下
第一个问题:
setup要传两个参数一个props和上下文,因为我没有使用props就使用第一种写法
// 报错没有创建emit
setup({emit}){
emit(“reload")
}
// 不报错可以正常使用
setup(props,{emit}){
emit(“reload")
}
有没有其他方案,就是可以传一个{emit}参数。
第二个问题:
// 这是父组件,写法为setup语法糖
// 打开一个弹出,传了三个值,b为响应式
const handleController = (a,b,c) =>{
updateOrderVisible.value = true
nextTick(()=>{
updateOrderWindowRef.value.init(a,b,c)
})
}
// 这是子组件,写法为setup()写法
setup(props,{emit}){
const all = reactive({
userData:userDataStore(),
dialogFormVisible:false,
dept:{},
formData:{},
init:async function(index,data,boolean){
console.log(data)
const readData = toRaw(data)
console.log(readData)
const {dept} = this.userData
this.title = readData.title
this.formData = readData
this.dept.deptName = dept.deptName
this.dialogFormVisible = true
this.disabled = boolean
this.projectList = await getProj()
}
})
return{
...toRefs(all)
}
}
遇到问题是修改子组件formData里的属性,父组件里的组件也被修改,我想到就是将传来的值变成普通数据就不会影响到父组件,但是使用了toRaw()之后,子组件修改数据,父组件也在修改,有没有什么方法可以互不影响。
第三个问题:
// 两个弹窗第一个不得不使用v-show,不仅要使用v-show还要加上nexTick()和await,不然就报错
// 只加上nextTick 会报错加警告,第二次才能打开弹窗,报的错也是最经常大家遇到的错误,就是addOrder()不存在
// 再加上一个await就不会报错和警告
// 但是我的初衷肯定要使用v-if,使用v-show的话弹窗里使用axios就提前发送了,这样就不太好
// 第二个使用v-if就没有半点毛病
const addOrderHandle = async() => {
addOrderVisible.value = true
await nextTick (() => {
addOrderWindow.value.addOrder()
})
addOrderActive.value = true
}
const handleController = (a,b,c) =>{
updateOrderVisible.value = true
nextTick(()=>{
updateOrderWindowRef.value.init(a,b,c)
})
}
<addOrder ref="addOrderWindow" v-show="addOrderVisible" @close="close" />
<updateOrder ref="updateOrderWindowRef" v-if="updateOrderVisible" @reload="tab3_reload"></updateOrder>
然后我有两个疑问:
1.父组件在nextTick里调用子组件方法,在被调用的子组件里都存在this,没有被调用的方法输出this是不存在的,按我的写法,被调用的方法this指向all这个属性里面所有的属性和方法。
2.就是这个写法有什么大影响吗?因为没见过人这样写。
第一个问题:
在 Vue 3 中,setup
函数需要接收两个参数,一个是 props
,一个是上下文对象 context
,如果你没有使用 props
,也可以省略第一个参数,但是要保留第二个参数 context
。因此,你可以这样写:
setup(_, { emit }) {
emit('reload')
}
在这个例子中,我们使用 _
代替了 props
参数,因为我们不需要使用它。通过这种方式,我们可以省略第一个参数,只使用第二个参数 context
中的 emit
属性。
第二个问题:
如果你想要避免修改子组件的属性影响到父组件,可以使用 toRefs()
方法将子组件的属性转换为响应式对象的属性引用,这样修改子组件的属性就不会影响到父组件了。你可以这样写:
setup(props) {
const formData = reactive(toRefs(props.formData))
const dept = reactive(toRefs(this.userData.dept))
const init = async function(index, data, boolean) {
console.log(data)
const readData = toRaw(data)
console.log(readData)
const第三个问题:
在 Vue 中,`v-if` 和 `v-show` 的作用是不同的,`v-if` 用于控制元素是否渲染到 DOM 中,而 `v-show` 用于控制元素的显示和隐藏。在你的代码中,使用 `v-show` 会导致子组件在渲染时被提前加载,可能会导致一些不必要的问题。如果你想使用 `v-if` 控制组件的渲染,可以尝试使用 `teleport` 组件将子组件挂载到指定的 DOM 节点中。例如:
```这样可以确保子组件在需要渲染时才会被加载。
你的第二个问题,父组件在 nextTick
中调用子组件方法时,子组件中的 this
指向的是子组件实例本身,而不是父组件的响应式数据。因此,你可以安全地在子组件中使用 this.formData
和 this.dept
,而不必担心影响到父组件。此外,你也可以使用 toRefs()
将子组件的数据转换为响应式对象的引用,以便更方便地使用。
第三个问题,使用 v-show
可能会导致子组件在渲染时被提前加载,可能会导致一些不必要的问题,因此建议使用 v-if
控制子组件的渲染。如果你想使用 v-if
控制组件的渲染,可以尝试使用 teleport
组件将子组件挂载到指定的 DOM 节点中,以便更好地控制子组件的渲染。
父组件在 nextTick
中调用子组件方法时,子组件中的 this
指向的是子组件实例本身,而不是父组件的响应式数据。因此,你可以安全地在子组件中使用 this.formData
和 this.dept
,而不必担心影响到父组件。此外,你也可以使用 toRefs()
将子组件的数据转换为响应式对象的引用,以便更方便地使用。
建议在 Vue 3 中使用 setup
函数,遵循 Vue 3 的编程规范,并根据需求选择合适的指令和组件,以便更好地控制组件的渲染和数据的响应式更新。