一颗努力的大土豆 2025-07-04 12:23 采纳率: 92.5%
浏览 53
已结题

VUE+Element-ui中,在添加表单中嵌套了两个组件,每个组件中都有输入款,如何给嵌套组件输入框加必填项规则

VUE+Element-ui中,在添加表单中嵌套了两个组件,每个组件中都有输入款,如何给嵌套组件输入框加必填项规则
页面是现在这样,遇见的问题是红色框住的部分没有必填提示

img

代码如下

<!-- 添加或修改网关设备对话框 -->
    <el-dialog :title="title" :visible.sync="open" width="600px" append-to-body>
      <el-form ref="form" :model="form" :rules="rules" label-width="110px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="设备名称" prop="eqpName">
              <el-input v-model="form.eqpName" placeholder="请输入设备名称" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="设备类型" prop="eqpType">
              <el-select v-model="form.eqpType" filterable placeholder="请选择设备类型" clearable >
                <el-option
                  v-for="item in eqpType"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                ></el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="IP地址" prop="ipAddress">
              <el-input v-model="form.ipAddress" placeholder="请输入IP地址" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="服务协议" prop="servProtocol">
              <el-select
                v-model="form.servProtocol"
                placeholder="请选择服务协议"
                clearable
              >
                <el-option
                  v-for="item in dict.type.service_protocol"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                >
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="服务IP地址" prop="servIpAddress">
              <el-input v-model="form.servIpAddress" placeholder="请输入服务IP地址"  />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="服务端口" prop="servPort">
              <el-input-number :min="1" :max="65535" v-model="form.servPort" placeholder="服务端口"  />
            </el-form-item>
          </el-col>
        </el-row>
        <el-form-item label="备注" prop="remark">
          <el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
        </el-form-item>
        <div style="margin-bottom:10px;margin-top:-10px" v-if="!updHandle">
          <span style="margin-left:32px;font-weight:bold">添加端口</span>
          <el-button style="float: right; padding: 3px 0" type="text" @click="addPort">+ 新增端口</el-button>
        </div>
        <div v-for="(port, index) in ports" :key="index">
          <el-card class="box-card" style="width:530px;margin-left:30px;">
            <div slot="header" class="clearfix">
              <span>端口{{ index+1 }}</span>
              <el-button style="float: right; padding: 3px 0;color:red" type="text" @click="removePort(index)" >- 删除端口</el-button>
            </div>
            <el-row>
              <el-col :span="12">
                <el-form-item label="端口名称" :prop="'ports.' + index + '.portName'" :rules="rules.portName">
                  <el-input v-model="port.portName" placeholder="请输入端口名称" />
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="网卡名称" :prop="'ports.' + index + '.nicName'" :rules="rules.nicName">
                  <el-input v-model="port.nicName" placeholder="请输入网卡名称" />
                </el-form-item>
              </el-col>
            </el-row>
            <el-row>
              <el-col :span="12">
                <el-form-item label="IP地址" :prop="'ports.' + index + '.portIpAddress'" :rules="rules.portIpAddress">
                  <el-input v-model="port.ipAddress" placeholder="请输入IP地址" />
                </el-form-item>
              </el-col>
              <el-col :span="12">
                <el-form-item label="MAC地址" :prop="'ports.' + index + '.portMac'" :rules="rules.portMac">
                  <el-input v-model="port.mac" placeholder="请输入MAC地址" />
                </el-form-item>
              </el-col>
            </el-row>
          </el-card>
        </div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button type="primary" @click="submitForm">确 定</el-button>
        <el-button @click="cancel">取 消</el-button>
      </div>
    </el-dialog>
.....
// 表单校验
      rules: {
        eqpName: [
          { required: true, message: "设备名称不能为空", trigger: "blur" }
        ],
        ipAddress: [
          { required: true, message: "IP地址不能为空", trigger: "blur" }
        ],
        eqpType: [
          { required: true, message: "设备类型不能为空", trigger: "blur" }
        ],
        servProtocol: [
          { required: true, message: "服务协议不能为空", trigger: "blur" }
        ],
        servIpAddress: [
          { required: true, message: "服务IP地址不能为空", trigger: "blur" }
        ],
        servPort: [
          { required: true, message: "服务端口不能为空", trigger: "blur" }
        ],
        portName: [
          { required: true, message: "端口名称不能为空", trigger: "blur" }
        ],
        nicName: [
          { required: true, message: "网卡名称不能为空", trigger: "blur" }
        ],
        portIpAddress: [
          { required: true, message: "IP地址不能为空", trigger: "blur" }
        ],
        portMac: [
          { required: true, message: "MAC地址不能为空", trigger: "blur" }
        ],
      },
      portRules: {
        portName: [
          { required: true, message: "端口名称不能为空", trigger: "blur" }
        ],
        nicName: [
          { required: true, message: "网卡名称不能为空", trigger: "blur" }
        ],
        ipAddress: [
          { required: true, message: "IP地址不能为空", trigger: "blur" }
        ],
        mac: [
          { required: true, message: "MAC地址不能为空", trigger: "blur" }
        ],
      },

  • 写回答

11条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-07-04 12:24
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 要在Vue + Element - ui的嵌套组件中的输入框添加必填项规则。
      - 目前存在问题是嵌套组件中的输入框没有显示必填提示。
    2. 解决方案:
      - 首先,需要在子组件中定义prop来接收父组件传递的必填项规则。
      - 然后,在子组件的模板中,根据接收到的规则来设置输入框的属性。
      - 以下是一个简单的示例代码:
      • 父组件:
    <template>
      <div>
        <child - component :required - rule="true"></child - component>
      </div>
    </template>
    
    <script>
    import ChildComponent from './ChildComponent.vue';
    export default {
      components: {
        ChildComponent
      },
      data() {
        return {
        };
      }
    };
    </script>
    
     - 子组件:
    
    <template>
      <div>
        <el - input v - if="requiredRule" placeholder="请输入" :rules="[
          { required: true, message: '该项为必填项', trigger: 'blur' }
        ]"></el - input>
      </div>
    </template>
    
    <script>
    export default {
      props: {
        requiredRule: {
          type: Boolean,
          default: false
        }
      },
      data() {
        return {
        };
      }
    };
    </script>
    
    1. 多种解决方案及优缺点:
      - 方案一:直接在子组件模板中根据prop添加规则。
      • 优点:简单直接,易于理解和维护。
      • 缺点:如果有多个不同的必填项规则,可能会导致模板代码冗余。
      • 方案二:在子组件中定义一个计算属性来生成规则数组。
      • 优点:可以使模板更简洁,逻辑更清晰。
      • 缺点:增加了计算属性的维护成本,如果规则变化频繁,可能会影响性能。
    <template>
      <div>
        <el - input :rules="inputRules" placeholder="请输入"></el - input>
      </div>
    </template>
    
    <script>
    export default {
      props: {
        requiredRule: {
          type: Boolean,
          default: false
        }
      },
      computed: {
        inputRules() {
          return this.requiredRule? [
            { required: true, message: '该项为必填项', trigger: 'blur' }
          ] : [];
        }
      },
      data() {
        return {
        };
      }
    };
    </script>
    
    1. 总结:
      - 要给Vue + Element - ui中嵌套组件的输入框添加必填项规则,关键是通过prop传递规则到子组件,并在子组件中根据规则设置输入框的属性。可以采用直接在模板中添加规则或通过计算属性生成规则数组的方式,各有优缺点,根据实际情况选择合适的方案。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 7月16日
  • 专家已采纳回答 7月8日
  • 创建了问题 7月4日