123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- <template>
- <div class="FormComponent">
- <div
- class="FormItemComponent"
- :style="setWidth"
- >
- <div
- v-for="(item,index) in dataColRol"
- :key="index"
- class="FormItemComponent-item"
- :style="setDiv(item)"
- >
- <component
- :is="item.component"
- :ref="'component_'+index"
- :index="index"
- :items="item.item"
- :readonly="readonly"
- @inputChange="inputChange"
- />
- </div>
- </div>
- <p v-if="buttonType">
- <el-button type="primary" plain icon="el-icon-search" @click="search">搜索</el-button>
- <el-button icon="el-icon-refresh" size="mini" @click="reset">重置</el-button>
- </p>
- </div>
- </template>
- <script>
- import Vue from "vue";
- import layoutAlgorithm from "@/api/layoutAlgorithm";
- export default {
- name: "FormItemComponent",
- props: {
- formItemLists: {
- type: Array,
- default() {
- return [];
- }
- },
- buttonType: {
- type: Boolean,
- default() {
- return true;
- }
- },
- defaultColumn: {
- type: Number,
- default: 4
- },
- readonly: {
- type: Boolean,
- default: false
- }
- },
- computed: {
- // 通过layoutAlgorithm算法得到对应的位置坐标
- dataColRol() {
- const list = layoutAlgorithm(this.defaultColumn, this.currentFormList);
- return Object.keys(list).reduce((temp, current) => {
- // 计算显示行数
- list[current].component = Vue.extend(list[current].component);
- temp.push(list[current]);
- return temp;
- }, []);
- },
- // 计算属性的 div 的坐标起始点
- setDiv() {
- return item =>
- ` grid-column:${item.x}/${item.col + item.x};grid-row:${
- item.y
- }/${item.y + item.row};`;
- },
- // 计算属性的 div的排列格式
- setWidth() {
- // `this` 指向 vm 实例
- const columns = Number(this.defaultColumn) || 4;
- return `grid-template-columns: repeat(${columns},${100 / columns}%`;
- }
- },
- watch: {
- formItemLists() {
- this.currentFormList = this.formItemLists.concat([]);
- }
- },
- data() {
- return {
- // defaultColumn:4, //默认一行4列
- formData: {}, //保存form中输入数据
- currentFormList: []
- };
- },
- created() {
- this.currentFormList = this.formItemLists.concat([]);
- console.log(this.formItemLists,999999999)
- },
- methods: {
- inputChange(value, items, type) {
- //有数据改变时
- // if(Object.prototype.toString.call(value) === '[object Array]' && (!value[0] || !value[1])){
- // delete this.formData[items.filed]
- // }else{
- // this.formData[items.filed] = value
- // }
- if (type && type === "select") {
- this.formData[items.slotfiled] = value;
- } else {
- this.formData[items.filed] = value;
- }
- this.$emit("formChange", this.formData);
- },
- search() {
- this.$emit("search", this.formData);
- },
- reset() {
- this.formData = {};
- this.currentFormList = this.currentFormList.concat([]);
- this.$emit("search", this.formData);
- }
- }
- };
- </script>
- <style lang="scss" scoped>
- .FormComponent {
- padding: 2px 10px 10px 10px;
- // border: 1px solid rgba(228, 228, 228, 1);
- }
- .FormComponent > p {
- padding-left: 108px;
- margin-top: 10px;
- display: flex;
- width: 300px;
- > button {
- margin-right: 10px;
- }
- }
- .FormItemComponent > div {
- /*border:1px solid #fff;*/
- box-sizing: border-box;
- }
- .FormItemComponent {
- display: grid;
- grid-template-columns: repeat(4, 25%);
- grid-auto-rows: minmax(auto);
- }
- </style>
|