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回答
-
同学你好
你这样的写法有问题啊,假如你要用 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
00 -
张轩
2023-05-05
同学你好
请问是否可以提供一下源代码(repo)?我在本地测试并没能复现这个问题呢。
022023-05-05
相似问题
回答 1
回答 1