动态添加条件表单

<template>
  <div class="rules-group-container tree box">
    <el-card class="box-card" style="margin-top: 10px">
      <el-main style="padding: 10px">
        <el-row>
          <el-row class="child">
            <el-radio-group v-model="object.rules" size="small">
              <el-radio-button label="and" value="and"></el-radio-button>
              <el-radio-button label="or" value="or"></el-radio-button>
            </el-radio-group>
            <el-button
              size="small"
              style="margin-left: 10px"
              type="text"
              @click="
                object.list.push({
                  rules: 'and',
                  type: 'group',
                  list: [
                    {
                      types: '',
                      site: '',
                      symbol: '',
                      rules: '',
                      type: 'condition',
                    },
                  ],
                })
              "
              >新增分组</el-button
            >
            <el-button
              size="small"
              style="margin-left: 10px"
              type="text"
              @click="
                object.list.push({
                  types: '',
                  site: '',
                  symbol: '',
                  rules: '',
                  type: 'condition',
                })
              "
              >新增条件</el-button
            >
            <el-button
              size="small"
              style="margin-left: 10px"
              type="text"
              v-if="parent !== undefined"
              @click="parent.list.splice(parent.list.indexOf(object), 1)"
              >删除条件组</el-button
            >
          </el-row>

          <template v-for="(item, index) in object.list">
            <el-row
              :key="'condition' + index"
              class="child"
              v-if="item.type == 'condition'"
            >
              <el-select
                v-model="item.types"
                size="small"
                style="width: 120px"
                placeholder="请选择"
              >
                <el-option label="无" value="无"> </el-option>
                <el-option label="19位编码" value="19位编码"> </el-option>
                <el-option label="内部编码" value="内部编码"> </el-option>
              </el-select>
              <!-- multiple  -->
              <el-select
                v-model="item.site"
                size="small"
                placeholder="请选择位置"
                style="margin-left: 10px; width: 150px"
              >
                <el-option label="1" value="1"> </el-option>
                <el-option label="2" value="2"> </el-option>
                <el-option label="3" value="3"> </el-option>
                <el-option label="4" value="4"> </el-option>
                <el-option label="5" value="5"> </el-option>
                <el-option label="6" value="6"> </el-option>
                <el-option label="7" value="7"> </el-option>
                <el-option label="8" value="8"> </el-option>
                <el-option label="9" value="9"> </el-option>
              </el-select>
              <el-select
                v-model="item.symbol"
                size="small"
                placeholder="请选择"
                style="margin-left: 10px; width: 100px"
              >
                <el-option label="等于" value="=="> </el-option>
                <el-option label="大于" value=">"> </el-option>
                <el-option label="小于" value="<"> </el-option>
                <el-option label="不等于" value="!="> </el-option>
                <el-option label="包含" value="包含"> </el-option>
                <el-option label="不包含" value="不包含"> </el-option>
                <el-option label="以...开头" value="以...开头"> </el-option>
                <el-option label="不以...开头" value="不以...开头"> </el-option>
              </el-select>
              <el-input
                v-model="item.rules"
                size="small"
                style="width: 200px; margin-left: 10px; margin-right: 10px"
                placeholder="请输入规则"
              ></el-input>
              <el-button @click="deleteRow(object.list, index)" size="small"
                >删除</el-button
              >
            </el-row>
            <el-row
              v-if="item.type == 'group'"
              :key="'group' + index"
              class="child"
            >
              <create-rule :object="item" :parent="object"></create-rule>
            </el-row>
          </template>
        </el-row>
      </el-main>
    </el-card>
  </div>
</template>
<script>
export default {
  name: "CreateRule",
  props: {
    object: {
      type: Object,
      default: {
        rules: "and",
        list: [{ type: "", site: "", symbol: "", rules: "" }],
      },
    },
    parent: {},
  },
  data() {
    return {};
  },
  methods: {
    deleteRow(row, index) {
      row.splice(index, 1);
    },
  },
};
</script>
<style scoped>
.box {
  width: 100%;
}
/* 只需要左边边框线 */
.child {
  width: 100%;
  position: relative;
  border: 1px solid #d9d9d9;
  border-style: none none none solid;
  padding: 10px 0;
  padding-left: 12px;
}
/* 设置一个伪元素宽2px 高50% 用于遮挡多余的左边框线 */
.child::before {
  display: block;
  content: "";
  position: absolute;
  background-color: white;
  width: 1px;
  height: 50%;
}
/* 设置第一个子元素的伪类定位 */
.box .child:first-child::before {
  left: -1px;
  top: 0;
}
/* 设置第二个子元素的伪类定位 */
.box .child:last-child::before {
  left: -1px;
  bottom: 0;
}
/* 设置子元素的横线,定位在高度的50% */
.box .child::after {
  top: 50%;
  left: 0;
  position: absolute;
  content: "";
  display: block;
  width: 10px;
  height: 1px;
  border: 1px solid #d9d9d9;
  border-style: solid none none none;
}
</style>

这里采用ElementUI构建,因此可以方便的组合各类ui控件来进行构建需要的界面。
当然该组件既然被看作树,因此其也是个递归组件,因此还涉及到自己调用自己。

 下面是使用

import CreateRule from '../../components/aaaaaa/ruledemo.vue'

 components: {
    CreateRule
  },

<CreateRule :object="object"></CreateRule>

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值