setup tsx中的插槽问题

来源:2-2 安装 Typescript 文档

有没有没被占用的昵称

2023-05-04

老师,我尝试用setup tsx写了一下组件和插槽发现了一点问题
1.子组件有一个点击事件,点击后密码会修改,但是父组件中并没有响应,这是为什么呢?
2.在父组件使用第二种写法的时候,控制台会出现警告
Slot “default” invoked outside of the render function: this will not track dependencies used in the slot. Invoke the slot function inside the render function instead.
第一种写法则不会出现警告,第二种写法应该怎么写才对呢?

子组件代码
图片描述
父组件代码1
图片描述
父组件代码2
图片描述
子组件代码

<template>
  <Comp />
</template>

<script setup lang="tsx">
import { ref, useSlots } from 'vue'

const slots = useSlots()

const obj = ref({
  username: 'wang',
  password: '123456'
})

const handleClick = () => {
  obj.value.password += '7'
}

const Comp = (
  <div>
    <div>{slots.default({ username: obj.value.username })}</div>
    <div onClick={handleClick}>{slots.pass({ password: obj.value.password })}</div>
  </div>
)
</script>

父组件代码1

<template>
  <Comp>
    <template #default="{ username }">
      <h2>{{ username }}</h2>
    </template>
    <template #pass="{ password }">
      <h2>{{ password }}</h2>
    </template>
  </Comp>
</template>

<script setup lang="tsx">
import Comp from './Comp.vue'
</script>

父组件代码2

<template>
  <Index />
</template>

<script setup lang="tsx">
import Comp from './Comp.vue'

const Index = (
  <Comp>
    {{
      default: ({ username }) => <h2>{username}</h2>,
      pass: ({ password }) => <h2>{password}</h2>
    }}
  </Comp>
)
</script>
写回答

2回答

张轩

2023-05-07

同学你好

你这样的写法有问题啊,假如你要用 jsx 的写法,最好就不要用 .vue 文件类型,这里你不更新就是因为 Comp 组件中的返回就是一个普通的 jsx 节点啊,它不是 vue 组件,所以不会更新的。

改成 tsx 的写法,并且返回一个 vue 组件就可以运作了。请看:

https://codesandbox.io/p/sandbox/nifty-hugle-qc5v36?file=%2Fsrc%2Fviews%2Fslot%2FComp2.jsx&selection=%5B%7B%22endColumn%22%3A24%2C%22endLineNumber%22%3A7%2C%22startColumn%22%3A24%2C%22startLineNumber%22%3A7%7D%5D

0
0

张轩

2023-05-05

同学你好

请问是否可以提供一下源代码(repo)?我在本地测试并没能复现这个问题呢。

0
2
有没有没被占用的昵称
老师我试了下这个,也会警告 https://vue-macros.sxzz.moe/macros/define-render.html
2023-05-05
共2条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3142 学习 · 2313 问题

查看课程