在computed中定义了el-form规则,使用validator验证,获取mounted返回的数据是,总是获取不到 -- 解决方法

<template>
  <div class="refresh-settings" v-if="this.maxLimitDay">
    <el-form ref="refreshSettingsRef" :model="form" :rules="rules">
      <el-form-item label="时间范围" prop="day" :label-width="formLabelWidth">
        <el-input v-model.number="form.day" placeholder="请输入天数">
          <template slot="prepend">最近</template>
          <template slot="append">天</template>
        </el-input>
      </el-form-item>
      <el-form-item label="自动更新" prop="open" :label-width="formLabelWidth">
        <el-radio-group v-model="form.open">
          <el-radio :label="1">开</el-radio>
          <el-radio :label="0">关</el-radio>
        </el-radio-group></el-form-item
      >
      <el-form-item label="" prop="hour" :label-width="formLabelWidth">
        <el-input v-model.number="form.hour" placeholder="请输入更新时间">
          <template slot="prepend">每天</template>
          <template slot="append">时</template>
        </el-input>
      </el-form-item>
    </el-form>
  </div>
</template>

<script scoped>
import store from '@/store';
import { forEach, cloneDeep } from 'lodash';
import Api from '../api';
export default {
  components: {},
  data() {
    return {
      maxLimitDay: '', // 最大限制天数
      form: {
        day: 7,
        open: 1,
        hour: 5,
      },
      formLabelWidth: '120px',
    };
  },
  computed: {
    searchOptions() {
      return {
        ...this.form,
      };
    },
    rules() {
      return {
        day: [
          {
            type: 'number',
            required: true,
            message: '时间范围必须为数字值',
            trigger: 'blur',
          },
        // 此时,这里需要把方法定义在methods中,如果直接使用validator()(rule, value,       
           callback) {},在这里面获取Mounted返回的值,是获取不到的,一直是Undefined
          {
            validator: this.validatorDay,
            trigger: 'blur',
          },
        ],
        hour: [
          {
            type: 'number',
            required: true,
            message: '更新时间必须为数字值',
            trigger: 'blur',
          },
          {
            pattern: /^(?:[0-9]|1[0-9]|2[0-3])$/,

            message: '输入范围在0-23时',

            trigger: 'blur',
          },
        ],
      };
    },
  },
  beforeDestroy() {},
  mounted() {
    this.getConfig();
    this.getMaxDaysByParamId();
  },
  methods: {
    /**
     * 获取底账更新配置最大天数
     */
    getMaxDaysByParamId() {
      Api.getMaxDaysByParamId({})
        .then((res) => {
          this.maxLimitDay = parseInt(res);
        })
        .catch((e) => {
          this.$msg.error(e.msg);
        });
    },
    validatorDay(rule, value, callback) {
      if (value < 1 || value > this.maxLimitDay) {
        callback(new Error('输入范围在1-' + this.maxLimitDay + '天'));
      } else {
        callback();
      }
    },
    confirm() {
      this.saveConfig();
    },
    cancel() {
      this.$emit('cancel');
    },
    getConfig() {
      Api.getDataAccountCornConfig()
        .then((res) => {
          if (res) {
            this.form.day = res.day != undefined ? res.day : 7;
            this.form.open = res.open != undefined ? res.open : 1;
            this.form.hour = res.hour != undefined ? res.hour : 5;
          }
        })
        .catch((error) => {
          this.$msg.error(error.msg);
        });
    },
    saveConfig() {
      this.$refs.refreshSettingsRef.validate((valid) => {
        if (valid) {
          Api.updateDataAccountCornTask(this.searchOptions)
            .then((res) => {
              this.$msg.success('更新配置成功!');
              this.$emit('cancel');
            })
            .catch((error) => {
              this.$msg.error(error.msg);
            });
        }
      });
    },
  },
  watch: {},
};
</script>

<style scoped lang="less">
.refresh-settings {
  height: 150px;
}
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个关于Vue3的问题,我会尽力回答。 首先,我们需要了解vue3v-model的实现方式。在vue3,v-model实际上是一个语法糖,它会根据组件的props和events来自动生成代码,从而实现双向绑定。 接下来,我们需要明确需求:要使用el-tree组件展示树形数据,并且要实现自定义v-model,以实现双向绑定。 那么,我们该如何实现呢? 首先,我们需要在组件定义一个value属性,用来保存树形数据。然后,在组件的props定义一个modelValue属性,用来接收父组件传递的数据。在组件的events,我们需要定义一个update:modelValue事件,用来向父组件发送数据更新的信号。 代码示例: ``` <template> <el-tree :data="treeData" :props="defaultProps" v-model:value="value"></el-tree> </template> <script> export default { props: { modelValue: { type: Array, default: () => [] } }, emits: ['update:modelValue'], data() { return { value: [] } }, computed: { treeData() { // 对modelValue进行处理,生成树形数据 // ... return treeData }, defaultProps() { return { children: 'children', label: 'label' } } }, watch: { modelValue(newValue) { this.value = newValue }, value(newValue) { this.$emit('update:modelValue', newValue) } } } </script> ``` 在上面的代码,我们定义了一个value属性,用来保存树形数据。在props,我们定义了一个modelValue属性,用来接收父组件传递的数据。在events,我们定义了一个update:modelValue事件,用来向父组件发送数据更新的信号。在computed,我们定义了一个treeData计算属性,用来将modelValue转换成树形数据。在watch,我们监听modelValue和value属性的变化,以实现双向绑定。 最后,我们在父组件使用定义v-model来绑定数据即可: ``` <template> <my-tree v-model="treeData"></my-tree> </template> <script> import MyTree from './MyTree.vue' export default { components: { MyTree }, data() { return { treeData: [] } } } </script> ``` 在上面的代码,我们使用了自定义v-model来绑定数据,实现了双向绑定。 希望这个回答能够帮到你!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值