This article mainly introduces the Vue project. On the premise of introducing element, the components are encapsulated twice to achieve direct layout through configuration items. 1. Query Condition Componentization Combined with the use of EventBus.js , event delivery is more efficient and various complex life cycle dependencies can be avoided. 1.1 dataForm code example // dataForm.vue <template> <el-row> <input-form v-for="(item,index) in options" :key="'dataForm_'+index"> <!-- Input box--> <input-form :key="index" v-if="item.type == 'input'" :data='item' ></input-form> </el-row> </template> <script> import EventBus from "@/assets/js/eventBus.js" import InputForm "@/components/dataForm/InputForm" export default { components: InputForm, }, props: { /** * Form configuration items * @param {Object} option Configuration parameters, as follows: * type: form item type, String, optional value input */ options: type: Array, default() { return []; }, }, }, data() { return {} }, created() { // This is mainly to realize the display and hiding of other subcomponents in the drop-down box EventBus.$on("refreshDataForm", e => { this.refreshDataForm(e); }); }, // Page destruction event destruction beforeDestroy() { EventBus.$off("refreshDataForm") EventBus.$off("handleClick") }, methods: { // Update form data refreshDataForm(item) { let data = this.options data.forEach((e, i) => { if (item.type == e.type && item.name == e.name) { this.options[i] = item } }) }, // The child component click event responds to the parent component, and the data is transferred handleClick(data) { EventBus.$emit("handleClick",data) }, //Format the form data (you can check if the required items are required) getDataForm() { let data = this.options let formObj = {} let error = '' try { data.forEach(e => { if (e.type === ''input) { if (e.require && !e.content) { error = 'Please enter' + e.label throw error } formObj[e.name] = e.content } else if (e.type === 'select' || e.type === 'dataSelect') { if (e.require && !e.content) { error = 'Please select' + e.label throw error } formObj[e.name] = e.content } else if (e.type === 'date' || e.type === 'dataRadio') { if (e.require && !e.content) { error = 'Please select' + e.label throw error } formObj[e.beginName] = e.beginRegTime formObj[e.endName] = e.endRegTime } else if (e.type === 'image') { formObj[e.name] = e.file || e.content } else if (e.type === 'upload') { formObj[e.name] = e.file || e.content if (e.delFileName) { // Delete the attachment collection and custom name and default name formObj[e.delFileName] = e.delFileIds.join(',') } else { formObj['delFileName'] = e.delFileIds.join(',') } } }) return formObj } catch (error) { this.$message({ message:error, type: 'error'}) } } } } 1.2 Subgroup inputForm.vue Note: The components referenced here can also be referenced individually by the page <template> <el-col> <el-col :span="data.boxSpan?data.boxSpan:boxSpan" v-if="!data.isHide"> <el-col :span="data.infoSpan?data.infoSpan:infoSpan" > <el-col :span="data.infoSpan?data.infoSpan:infoSpan" v-if="data.labelSpan!=0"> <label class="el-form-item_label" :class="{'require': data.require}" v-html="data.label"></label> </el-col> <el-col :span="data.contentSpan?data.contentSpan:contentSpan" v-if="data.contentSpan!=0"> <el-input :class="{'base_textarea': data.textarea}" v-modle.trim="data.content" :type="data.textarea?'textarea':''" :disable="data.readOnly" :placeholder="setPlaceholder" maxlength="200"></el-input> </el-col> </el-col> <span v-text="title"></span> </div> </el-col> </template> <script> export default { props: { // Type input input box type: { type: String, default: 'input' }, //Default fence layout 8/24 boxSpan: { type: Number, default: 8 }, // Default fence layout 24/24 infoSpan: { type: Number, default: 24 }, //Default fence layout 8/24 span: { type: Number, default: 8 }, //Default fence layout 16/24 contentSpan: { type: Number, default: 16 }, /** * name keyword * type form type * label form title * content form content * readOnly read-only default no * isHide hidden default no * textarea text type default no **/ data: { type: Object, default() { return [] } } }, computed: { setPlaceholder() { if(this.data.readOnly && !this.data.content) { return '' } return 'Please enter' } } } </script> <style scoped> // Required style.require::after { content: '*'; color:red; } // flex layout title vertically centered.el-form-item__label { float:right; margin-botton:0; line-height: 20px; display: flex; align-items: center; min-height: 40px; } </style> 1.3 Parent page reference and use <template> <el-row> <data-form :options='searchArray' ref='searchArray'></input-form> </el-row> </template> <script> import EventBus from "@/assets/js/eventBus.js" import DataForm "@/components/dataForm/dataForm" export default { components: DataForm }, data() { return { // Query menu configuration searchArray: [ { name: 'personName', type: 'input', label: 'Username', content: '' }, { name: 'personName2', type: 'input', label: 'Username 2', content: '' } ] } }, created() { // Listen for child component parameters EventBus.$on('refreshDataForm', e => { this.refreshDataForm(e) }) }, destroyed() { // Destroy the subcomponent parameter listening EventBus.$off('refreshDataForm') }, methods: { // Listen for subcomponent operations refreshDataForm(e) { //Logic code this.$forceUpdate() }, //Data query handleQuery() { // Get component parameters and return to json format let searchArray = this.$refs.searchArray.getDataForm() // If there are required items, the return value is null, and a pop-up window will appear if (!searchArray) { return } //Query interface logic} } } </script> The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM. You may also be interested in:
|
<<: Detailed explanation of MySQL 8.0 password expiration policy
Table of contents 1. Overview 2. Routing Navigati...
<br />Conditional comments are a feature uni...
Click here to return to the 123WORDPRESS.COM HTML ...
First check the kernel version you are using lin@...
I saw a good idea and recorded it. I have used jQ...
1. Install tools and libraries # PCRE is a Perl l...
Method 1: Use table attributes: header-cell-class...
illustrate: There are two main types of nginx log...
Open the cpanel management backend, under the &qu...
When a request is sent to your server to display ...
Preface Hello everyone, this is the CSS wizard - ...
Core code <!DOCTYPE html> <html lang=&qu...
Table of contents What does the COUNT function do...
1 Introduction When designing a database, it is i...
In fact, this is very simple. We add an a tag to ...