<template>
    <el-card header="当一个vue页面有多个相同dom结构时，dom比较简单，不想提一个子组件，这个时候可以使用jsx语法">
        <h3>vue template写法</h3>
        <ul class="demo-jsx-ul">
            <li
                v-for="item in list"
                :key="item.name"
            >
                <div>姓名: {{ item.name }}</div>
                <div>年龄: {{ item.age }}</div>
                <div>地址: {{ item.address }}</div>
            </li>
        </ul>

        <h3>vue jsx写法DOM一</h3>
        <renderJsx
            refName="JsxUlRef1"
            label="1"
            :list="list"
        />
        <h3>vue jsx写法DOM二</h3>
        <renderJsx
            refName="JsxUlRef2"
            label="2"
        />
    </el-card>
</template>

<script setup lang="jsx">
import { ref, onMounted } from 'vue';
import { message } from '@/utils/message';
import styles from './jsx.module.scss';

/**
 * 1. jsx中怎么使用element组件
 * 2. jsx语法中样式问题（全局，css modules）
 * 3. jsx语法中ref的使用
 * 4. jsx在template中怎么写才能渲染
 */
defineOptions({
    name: 'DemoJsx',
});

const refs = ref({});
const list = ref([
    {
        name: 'John',
        age: 25,
        address: 'New York',
    },
    {
        name: 'Jane',
        age: 30,
        address: 'London',
    },
    {
        name: 'Bob',
        age: 28,
        address: 'Paris',
    },
]);

const renderJsx = (props) => {
    console.log(props);
    return (
        <ul class="demo-jsx-ul">
            {list.value.map((item, index) => (
                <li key={index}>
                    <div>姓名: {item.name}</div>
                    <div>年龄: {item.age}</div>
                    <div>地址: {item.address}</div>
                </li>
            ))}
            <el-button
                type="primary"
                class="mb-10"
                onClick={elementBtnClick}
            >
                测试添加element组件
            </el-button>
            <div class={styles.btn}>css modules样式测试</div>
            <el-button
                ref={(el) => (refs.value[props.refName] = el)}
                type="primary"
                onClick={() => changeRefText(props.refName, props.label)}
            >
                测试ref{props.label}
            </el-button>
        </ul>
    );
};

const elementBtnClick = () => {
    message('elementBtnClick', { type: 'info' });
};

const changeRefText = (refName, label) => {
    refs.value[refName].ref.innerText = `测试ref${label}改名字了`;
};

onMounted(() => {
    console.log(refs);
});
</script>

<style lang="scss" scoped>
/** 这里局部样式对jsx组件不会生效 */
// .demo-jsx-ul {
//     margin: 0 auto;

//     li {
//         border: 1px solid #ccc;
//         padding-left: 20px;
//         margin: 20px 0;
//     }
// }
</style>
<style lang="scss">
/** 这里的样式相当于是全局样式，对jsx组件会生效，但是也会影响其他所有样式，另外一种解决方案是css module, 参考上面例子 */
.demo-jsx-ul {
    margin: 0 auto;

    li {
        border: 1px solid #ccc;
        padding-left: 20px;
        margin: 20px 0;
    }
}
</style>
