父组件
<template>
<div>
<div class="box">index组件</div>
<test accept-attr="menffy-props" @on-click="handleEmit" />
</div>
</template>
<script lang="ts">
export default {
name: 'ApplyAWSIndex',
};
</script>
<script setup lang="ts">
import test from './app';
const handleEmit = (v) => {
console.log('父组件接收到子组件事件:', v);
};
</script>
<style scoped lang="less">
.box {
background-color: yellow;
}
</style>
app.tsx
import { defineComponent, ref } from 'vue';
const A = (_, { slots }) => (
<>
<div>{slots.default ? slots.default() : '默认值'}</div>
<div>{slots.foo?.()}</div>
</>
);
interface PropsInterface {
acceptAttr: string;
}
export default defineComponent({
name: 'ComponentName',
props: {
acceptAttr: {
type: String,
default: '',
},
},
emits: ['on-click'],
setup(props: PropsInterface, { emit }) {
const show = ref(true);
const data = ref([
{
name: 'menffy',
},
{
name: 'menffy2',
},
{
name: 'menffy3',
},
]);
const bindAttr = 'attr';
const handleClick = (v) => {
console.log('触发事件', v);
emit('on-click', v);
};
const slots = {
default: () => <div>我是插槽defualt</div>,
foo: () => <div>我是插槽foo</div>,
};
const targetValue = ref<string>('');
return () => (
<>
<span>双向绑定值输入框:</span>
<input type="text" v-model={targetValue.value} />
<div>双向绑定值:{targetValue.value}</div>
<A v-slots={slots}></A>
<hr />
<div>
{show.value ? <div id={bindAttr}>我是方法三</div> : ''}
{data.value.map((item, index) => {
return (
<div>
{index} - {item.name}
</div>
);
})}
</div>
<div>我是接收的属性值:{props.acceptAttr}</div>
<a onClick={() => handleClick('params')}>点击触发事件</a>
</>
);
},
});