使用响应式问题加v-if,写法没见过

今天遇到三个问题,都没解决,有没有懂得看看,指点我一二
我贴下

第一个问题:
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.formDatathis.dept,而不必担心影响到父组件。此外,你也可以使用 toRefs() 将子组件的数据转换为响应式对象的引用,以便更方便地使用。

第三个问题,使用 v-show 可能会导致子组件在渲染时被提前加载,可能会导致一些不必要的问题,因此建议使用 v-if 控制子组件的渲染。如果你想使用 v-if 控制组件的渲染,可以尝试使用 teleport 组件将子组件挂载到指定的 DOM 节点中,以便更好地控制子组件的渲染。

父组件在 nextTick 中调用子组件方法时,子组件中的 this 指向的是子组件实例本身,而不是父组件的响应式数据。因此,你可以安全地在子组件中使用 this.formDatathis.dept,而不必担心影响到父组件。此外,你也可以使用 toRefs() 将子组件的数据转换为响应式对象的引用,以便更方便地使用。

建议在 Vue 3 中使用 setup 函数,遵循 Vue 3 的编程规范,并根据需求选择合适的指令和组件,以便更好地控制组件的渲染和数据的响应式更新。