Files
ylst-h5/src/views/Design/components/Questions/MartrixQuestion.vue
陈昱达 d19b2b2b3f refactor(components): 优化内容可编辑组件和问题项的显示- 为 contenteditable 组件添加 flex 类,优化样式
- 在问题项前增加标题编号,提高可读性
- 修改发布问题时的路由跳转方式,使用 replace 代替 push
2025-03-21 20:20:23 +08:00

115 lines
3.0 KiB
Vue

<script setup lang="ts">
import { type Component, computed, defineModel } from 'vue';
import MatrixCheckbox from '@/views/Design/components/Questions/MatrixCheckbox.vue';
import MatrixText from '@/views/Design/components/Questions/MatrixText.vue';
import MatrixRadio from '@/views/Design/components/Questions/MatrixRadio.vue';
const question = defineModel<question>('element', {
type: Object,
default: () => {
return {};
}
});
const rowRecord = defineModel<unknown[]>('rowRecord', { required: false, default: () => [] });
const isPreview = defineModel<boolean>('isPreview', { required: false, default: false });
// eslint-disable-next-line
const activeComponent = computed<Component>(() => {
switch (question.value.question_type) {
case 8:
return MatrixText;
case 9:
return MatrixRadio;
case 10:
return MatrixCheckbox;
}
});
if (question.value?.list) question.value.options = question.value?.list;
// 行标签
const rows = defineModel<questionOptionType[]>('rows', { required: false, default: () => [] });
rows.value.length < 1 && (rows.value = question.value?.options[0] ?? []);
// 列标签
const cols = defineModel<questionOptionType[]>('cols', { required: false, default: () => [] });
cols.value.length < 1 && (cols.value = question.value?.options[1] ?? []);
// console.log(rows.value, cols.value);
// const columnLabels = useTemplateRef<HTMLElement[]>('columnLabels');
// 注意, element.options 里面的东西是数组,第一项内容是行标签内容,第二项内容是列标签内容
// 类型 AI 生成 切勿盲目相信,以实际为准
/* const props = */
defineProps<{
index: number;
active: boolean;
}>();
const emit = defineEmits(['update:element']);
const emitValue = () => {
// console.log(question.value);
emit('update:element', question.value);
};
const errorMessage = defineModel('errorMessage', {
type: String,
default: ''
});
</script>
<template>
<van-field
v-model="question.stem"
:label="question.stem"
:required="question.config.is_required === 1"
label-align="top"
class="contenteditable-question-title"
>
<template #left-icon>
{{ index + 1 }}
</template>
<!-- 使用 title 插槽来自定义标题 -->
<template #label>
<contenteditable
v-model="question.stem"
:active="active"
className="contenteditable-label"
@blur="emitValue"
:errorMessage="errorMessage"
/>
</template>
<template #input>
<Component
:is="activeComponent"
v-model:rowRecord="rowRecord"
v-model:element="question"
v-model:rows="rows"
v-model:cols="cols"
:is-preview="isPreview"
:active="active"
style="overflow: scroll; width: 88vw"
/>
</template>
</van-field>
</template>
<style lang="scss" scoped>
.matrix-table {
width: 100%;
border-collapse: collapse;
color: black;
& > tbody {
overflow: scroll;
}
th,
td {
border-width: 0 0 1px;
text-align: center;
}
}
.td-input {
text-align: center;
}
</style>