当前位置: 首页 > wzjs >正文

前端网站效果有哪些小程序免费推广平台

前端网站效果有哪些,小程序免费推广平台,注册外贸网站有哪些,WordPress评论加签到需求:左侧是个菜单组件,有对应的表单类型。 右侧是渲染组件,点击左侧菜单或者拖动即可渲染出对应的组件 项目中采用vuedraggable实现拖拽功能。 具体实现是使用elementplus的组件,然后根据tagName的类型去渲染不同的组件。 首先…

需求:左侧是个菜单组件,有对应的表单类型。
右侧是渲染组件,点击左侧菜单或者拖动即可渲染出对应的组件
项目中采用vuedraggable实现拖拽功能。

具体实现是使用elementplus的组件,然后根据tagName的类型去渲染不同的组件。

首先是大的组件包含左右的盒子组件,代码如下:

   <div class="iform_editor"><div class="iform_editor_menu"><FormMenuDrag  :formType="templateConf.type" @scroll-to-top="scrollToTop" /></div><div class="iform_editor_content"><ElScrollbar ref="renderScrollBar" class="iform_editor_content_sw"><el-backtoptarget=".iform_editor_content_sw .el-scrollbar__wrap":right="300":bottom="50"/><FormRenderDrag  @form-publish="formPublish" :formType="templateConf.type" /></ElScrollbar></div></div>

左侧菜单组件代码如下:

  <div class="form_menu_drag"><ElScrollbar v-loading="false"><div class="component_menu_list" v-for="(item, keyIndex) in formItemConf" :key="keyIndex"><h4 class="tool_bar_title">{{ item.groupTitle }}</h4><draggable:list="item.groupList"class="tool_item_list":group="{name: 'componentsGroup',pull: 'clone',put: false,}":clone="handleClone":sort="false":item-key="'renderKey'"><template #item="{ element, index }"><div class="tool_item"><ElPopoverplacement="right"trigger="hover"width="300":offset="index % 2 == 0 ? 150 : 12":disabled="!config.explainList[element.customConf.label]"><template #reference><divclass="tool_item_drag":class="{ disabled: checkItem(element?.customConf?.tagName || '') }"@click.stop="handleAdd(element)"><Icon class="tool_item_icon" :icon="`svg-icon:${element.customConf.tagIcon}`" />{{ element.customConf.label }}</div></template><FormItemExplainCardv-if="config.explainList[element.customConf.label]":explain="config.explainList[element.customConf.label]"/></ElPopover></div></template></draggable></div></ElScrollbar></div>
<script setup lang="ts">
import { ref } from 'vue';
import draggable from 'vuedraggable';
import EditorUtils from '@/utils/Editor_utils';
import { Icon } from '@/components/Icon';
import { IFormModel } from 'Editor';
import { useEditorStore } from '@/store/modules/iform/editor';
import FormItemExplainCard from './form_item_explain_card.vue';
import config from '@/config/iform_editor_config';
import { storeToRefs } from 'pinia';
import { cloneDeep } from 'lodash-es';const editorStore = useEditorStore();
let { formDataList } = storeToRefs(editorStore);
const emit = defineEmits(['scroll-to-top']);interface formGroupList {groupTitle: string;groupList: IFormModel.formItemConf[];
}
const props = defineProps<{ formType: number }>();
const formType = ref(props.formType);const commonList = [{groupTitle: '选择',groupList: EditorUtils.getDefaultItemConfig('select'),},{groupTitle: '文本',groupList: EditorUtils.getDefaultItemConfig('text'),},
];const assessmentList = [{groupTitle: '考前准备',groupList: EditorUtils.getDefaultItemConfig('assessmentPreparation'),},{groupTitle: '常用题型',groupList: EditorUtils.getDefaultItemConfig('assessmentCommon'),},
];const formItemConf = ref<formGroupList[]>(formType.value == 2 ? assessmentList : commonList);const handleClone = (e) => {return cloneDeep(e);
};const handleAdd = (e) => {const item = cloneDeep(e);const tagName = item.customConf.tagName;editorStore.addFormItem(tagName, '', undefined, true);editorStore.setFormSetting(false);nextTick(() => {const newDom = document.querySelector('.drag_item.isActive');newDom?.scrollIntoView({ behavior: 'smooth', block: 'center' });});
};const checkItem = (tagName: string) => {if (tagName == 'el-assessment-instructions' ||tagName == 'el-assessment-userinfo' ||tagName == 'el-assessment-cascader' ||tagName == 'el-assessment-text') {return unref(formDataList)?.find((item) => {return item?.customConf?.tagName == tagName;});} else {return false;}
};
</script>

中间组件内容:

<template><draggableclass="draggable_wrap":class="{ hide: dragFormDataList.length < 1 && !isAni }":group="{name: 'componentsGroup',}":list="dragFormDataList":handle="'.handle_bar'":item-key="'renderKey'":sort="true"@change="draggableChange"><template #item="{ element, index }"><divclass="drag_item":class="{ isActive: activeKey == element.renderKey }"@click.stop="selectItem(element.renderKey)":data-key="element.renderKey":id="element.formItemKey"><DragToolBarv-show="activeKey == element.renderKey":labelName="element?.customConf?.label || ''":tagName="element?.customConf?.tagName || ''":renderKey="element.renderKey":customConf="element?.customConf":formType="formType"@trigger-copy="onCopyFn(element?.customConf?.tagName || '', element.formItemKey, index + 1)"@trigger-del="onDeleteFn(element.formItemKey, index)"@trigger-change="(type) => onChangeFn(type, element.formItemKey)"/><div class="item_content"><FormReducer:sn="handleFormat(element.baseConf.numType, index, element.formItemKey)":formItemData="element"/></div></div></template></draggable></template>

FormReducer组件的内容:

<script lang="ts">
// placeholders里边都是写好的各个类型的组件,直接引入。
import BaseFormItem from './components/base_from_item.vue';
import {PInput,
} from './components/placeholders';
import { tagTypeEnum } from '@/types/option_enum';
import { IFormModel } from 'Editor';
import type { PropType } from 'vue';export default defineComponent({props: {sn: {type: Number,required: true,},formItemData: {type: Object as PropType<IFormModel.formItemConf>,required: true,},},emits: ['updateMsg'],setup(props) {const currentData = ref(props.formItemData);watch(() => props.formItemData,() => {currentData.value = props.formItemData;},);// const currentData = ref<IFormModel.formItemConf>(props.formItemData);if (unref(currentData).customConf) {switch (unref(currentData).customConf.tagType) {case tagTypeEnum.INPUT: {return () => {return h(BaseFormItem,{sn: props.sn,renderKey: unref(currentData)?.renderKey || '',},() => [h(PInput, {renderKey: unref(currentData)?.renderKey || '',}),],);};}case tagTypeEnum.INPUTGROUP: {return () => {return h(BaseFormItem,{sn: props.sn,renderKey: unref(currentData)?.renderKey || '',},() => [h(PInputGroup, {renderKey: unref(currentData)?.renderKey || '',}),],);};}default: {return () => {return h('');};}}}},
});
</script>

已上就是整个实现过程啦!


文章转载自:

http://huEYmTx1.snyqb.cn
http://CLEVmcVE.snyqb.cn
http://VR2JQwVG.snyqb.cn
http://vJoKapWF.snyqb.cn
http://MHCjTzYP.snyqb.cn
http://0H2PCYwq.snyqb.cn
http://PuLglyz5.snyqb.cn
http://jYh5QMOx.snyqb.cn
http://4Oopv4FC.snyqb.cn
http://IRqSaINC.snyqb.cn
http://zchtw8qp.snyqb.cn
http://nKXybPcw.snyqb.cn
http://H0ylx9rK.snyqb.cn
http://nLk96ALj.snyqb.cn
http://nnM1wINo.snyqb.cn
http://SNuhP2DG.snyqb.cn
http://EhR2sbKf.snyqb.cn
http://dn2liZMu.snyqb.cn
http://07VsPYX0.snyqb.cn
http://4Jjmousp.snyqb.cn
http://ij3zalME.snyqb.cn
http://vSmXlvRG.snyqb.cn
http://QwuwZeeT.snyqb.cn
http://IB17AlLx.snyqb.cn
http://bHDDIl1Q.snyqb.cn
http://04kF3nap.snyqb.cn
http://g2LEVvUg.snyqb.cn
http://2v3T21lx.snyqb.cn
http://O5kfc0dE.snyqb.cn
http://i1uI0vlp.snyqb.cn
http://www.dtcms.com/wzjs/755532.html

相关文章:

  • 网站建设和维护做什么个人网站建设规划
  • 做网站常用的英文字体wordpress 优化 插件
  • idea可以做网站吗what is wordpress
  • 小榄做网站企业做外贸有哪些免费的网站有哪些
  • 电商网站开发技术与服务器给个网址2021年能看的
  • 化妆品网站建设实训总结企业网站接入微信支付
  • 网站推广策划案怎么选基金项目实验室信息网站建设
  • 网站如何注销百度头条怎么做网站
  • 营销型网站管理系统在网上那里能接单做网站
  • wordpress 多站点用户wordpress做淘宝的交流插件
  • 商城网站开发报信阳高端网站建设
  • 阜宁哪家专业做网站国外免费做网站软件
  • 做网站和做免费推广网站的区别张家港企业网站
  • 专业北京网站建设公司排名景区网站做电子商务的特点
  • 禅城网站制作网络优化工程师吃香吗
  • 北京seo方法seo关键词排名优化怎么做
  • 如何做网站教程简单新手建网站需要怎么做呢
  • 网站建设页面设计规格百科网站怎么做
  • 如何做汽车的创意视频网站设计在手机上怎么注册公司
  • 德州汇泽网站建设怀化百度关键词优化公司
  • 英德市网站建设wordpress开启vip会员查看
  • 怎么做互联网营销推广高级seo优化招聘
  • 西安建设和住房保障局网站线上广告代理平台
  • c++可以做网站吗网站建设基础教程人教版
  • 设计公司网站的主页怎么做html页面生成器
  • 网站设计开发维护成都展厅设计公司
  • 做某网站的设计与实现大连网站建设具体流程是什么
  • html5国内网站90做网站
  • 做外贸如何建立网站平台怎么自做网站
  • 做贺卡 网站html电影网页设计实例代码