Skip to content

阅读模式回显

自定义组件的阅读模式允许在组件内部控制如何显示回显内容,使得在阅读模式下可以以不同于编辑模式的方式展示数据。

预定义全局数据

自定义组件

在自定义组件中,您可以通过 preview 属性来判断当前是否处于阅读模式,并根据此状态来展示不同的内容。

vue
<template>
    <div class="_fc-value">
        <!--阅读模式下-->
        <template v-if="preview">
            {{modelValue}}
        </template>
        <!--表单模式下-->
        <template v-else>
            <el-input :modelValue="modelValue" @update:modelValue="input"></el-input>
        </template>
    </div>
</template>
<script>
    import {defineComponent} from 'vue';
    export default defineComponent({
        name: 'FInput',
        props: {
            modelValue: String,
            //自动注入
            formCreateInject: Object,
        },
        computed: {
            //获取是否在阅读模式中
            preview(){
                return this.formCreateInject.preview;
            }
        }
        methods: {
            input(val){
                this.$emit('update:modelValue', val);
                this.$emit('change', val);
            }
        }
    });
</script>

拖拽规则

在定义拖拽规则时,可以通过设置 readMode: 'custom' 来指定该组件的阅读模式为自定义模式。这将告知设计器使用自定义的回显逻辑来渲染组件。

js
import uniqueId from '@form-create/utils/lib/unique';
const label = '自定义输入框';
const name = 'FInput';
const FInputRule = {
    menu: 'main',
    icon: 'icon-value',
    label,
    name,
    event: ['change'],
    rule({t}) {
        return {
            type: name,
            field: uniqueId(),
            //在这里定义
            readMode: 'custom',
            title: '自定义输入框',
            info: '',
            props: {},
        };
    },
    props() {
        return [];
    }
};

挂载组件和拖拽规则

在完成组件和拖拽规则的定义后,您需要将它们挂载到 FcDesigner 实例中,以使其能够在设计器中使用。

js
//挂载组件
FcDesigner.addCompoent(FInput);
//挂载拖拽规则
this.$refs.designer.addComponent(FInputRule);

动态回显内容

在一些复杂的场景中,您可能需要根据用户的输入或其他条件动态调整回显内容。可以通过动态计算 modelValue 来实现这一需求。

vue
<template>
    <div class="_fc-value">
        <!-- 阅读模式下 -->
        <template v-if="preview">
            <span v-if="isSpecialCondition">{{ specialContent }}</span>
            <span v-else>{{ modelValue }}</span>
        </template>
        <!-- 表单模式下 -->
        <template v-else>
            <el-input :modelValue="modelValue" @update:modelValue="input"></el-input>
        </template>
    </div>
</template>


<script>
import { defineComponent } from 'vue';


export default defineComponent({
    name: 'FInput',
    props: {
        modelValue: String,
        formCreateInject: Object,
    },
    computed: {
        preview() {
            return this.formCreateInject.preview;
        },
        isSpecialCondition() {
            // 根据业务逻辑判断是否满足特殊条件
            return this.modelValue === 'special';
        },
        specialContent() {
            // 根据特殊条件生成回显内容
            return '特殊内容';
        }
    },
    methods: {
        input(val) {
            this.$emit('update:modelValue', val);
            this.$emit('change', val);
        }
    }
});
</script>