Vuejs поле ввода дорожки - PullRequest
0 голосов
/ 14 июля 2020

Мне нужно проверить, является ли мое поле ввода пустым или нет.

Logi c

  1. если form.name имеет значение, используйте функцию увеличения
  2. если form.name пусто, используйте функцию уменьшения
  3. не используйте функции increase, decrease для каждого символа, который пользователь вводит или удаляет

Код

<el-form-item label="Product name *">
  <el-input v-model="form.name"></el-input>
</el-form-item>


methods: {
 increase() {
  this.percentage += 8.3;
  if (this.percentage > 100) {
    this.percentage = 100;
  }
 },
 decrease() {
  this.percentage -= 8.3;
  if (this.percentage < 0) {
    this.percentage = 0;
  }
 },
}

есть идея?

Обновить

Script

data() {
    return {
        form: {
            name: '', // require
            slug: '',
            price: '', // require
            supplier_id: '', // require
            new_price: '',
            base_price: '',
            sku: '',
            qty: 1, // require
            active: '', // require
            photo: '',
            photos: [],
            shortDesc: '',
            longDesc: '',
            origin: '',
            tags: [],
            brand_id: '', // require
            categories: [],
            user_id: '',
            seoTitle: '',
            seoTags: '',
            seoPhoto: '',
            seoDescription: '',
            variations: [],
            options: [],
            condition: '', // require
            isbn: '',
            ean: '',
            upc: '',
            height: '',
            weight: '',
            lenght: '',
            width: '', // require
        },
    }
},
methods: {
    onSubmit(e) {
        e.preventDefault();
        axios.post('/api/admin/products/store', this.form)
        .then(res => {
            // do my things
        })
        .catch(function (error) {
            console.log('error', error);
        });
    },
}

HTML

<el-form ref="form" :model="form" label-width="120px" enctype="multipart/form-data">
    // my inputs (listed in form part in script above)

    <el-button type="primary" @click="onSubmit" native-type="submit">Create</el-button>
</el-form>

1 Ответ

1 голос
/ 14 июля 2020

Одним из возможных решений было бы использовать события @focus и @blur, чтобы проверить, имеет ли form.name значение перед увеличением или уменьшением, это будет срабатывать при фокусе или событиях размытия, поэтому у вас не будет методов запускается при каждом вводе или удалении символа.

например:

<el-form-item label="Product name *">
  <el-input @focus="checkName" @blur="checkName" v-model="form.name"></el-input>
</el-form-item>


methods: {

 checkName() {
   //If form.name has a value then run increase method, otherwise run decrease method
  !!this.form.name ? this.increase() : this.decrease()
 },
 increase() {
  this.percentage += 8.3;
  if (this.percentage > 100) {
    this.percentage = 100;
  }
 },
 decrease() {
  this.percentage -= 8.3;
  if (this.percentage < 0) {
    this.percentage = 0;
  }
 },
}

Вы можете увидеть рабочую скрипку ЗДЕСЬ

ОБНОВЛЕНИЕ

Хорошо, я следовал правилам, которые вы указали в своем вопросе, и я не знал, что вы хотите получить процент заполнения формы, поэтому для этого я бы предложил используйте вычисляемое свойство, вы можете узнать больше о вычисленных свойствах в VueJS Документации , таким образом процент вычисляется на основе критериев, которые мы можем дать ему, и только если форма имеет значения.

computed: {
        formProgress: function () {
        let totalInputs = Object.keys(this.form).length;
        let filledInputs = 0;
        Object.values(this.form).forEach(val => {
          if (!!val){
            filledInputs++;
          }
        });
        return (filledInputs/totalInputs)*100
        }
    },

Как вы можете видеть в одном вычисляемом свойстве, вы можете обрабатывать сложные logi c и возвращать значение реактивно, чтобы лучше объяснить, я считаю длину объекта формы, чтобы получить ge t общее количество входов в вашей форме, поэтому важно, чтобы все данные вашей формы находились внутри объекта данных формы, затем я конвертирую этот объект в массив для его итерации, и я проверяю, имеет ли каждое свойство значение на нем, если оно Я добавляю 1 к счетчику filledInputs и, наконец, просто возвращаю простую математику, чтобы получить процент. пожалуйста, проверьте новую скрипку здесь, чтобы увидеть ее в действии:

FORM PROGRESS FIDDLE

Если у вас есть другие сомнения, просто дайте мне знать.

ОБНОВЛЕНИЕ 2:

Хорошо, чтобы подсчитывать только указанные c входы для прогресса формы, я изменил код для работы на основе массива, который содержит имена свойства, которые требуются. вот полный код:

data() {
      return {
        form: {
            name: '',
          lastName: null,
          categories: [{}],
        },
        requiredFields: ['name', 'categories']
      };
    },
    computed: {
        formProgress: function () {
        let totalInputs = this.requiredFields.length;
        let filledInputs = 0;
        Object.entries(this.form).forEach(entry => {
            const [key, val] = entry;
          if (this.requiredFields.includes(key)){
            switch (val.constructor.name) {
                case "Array":
                if (val.length !== 0){
                    if (Object.keys(val[0]).length !== 0){
                    filledInputs++;
                    }
                }
                break
              case "Object":
                if (Object.keys(val).length !== 0){
                    filledInputs++;
                }
                break
              default:
                if (!!val){
                    filledInputs++;
                }
            }
          }
        });
        return Number((filledInputs/totalInputs)*100).toFixed(1)
        }
    },

А вот обновленный FIDDLE

Как вы можете видеть, теперь я использую Object.entries для получения ключа и значение объекта формы, поэтому у вас может быть один объект формы для отправки на ваш бэкэнд, таким образом я сначала проверяю, находится ли ключ в обязательных полях, и имеет ли значение, поэтому все, что вам нужно сделать, это обновить массив данных requiredFields с теми же именами, что и ваше свойство данных input, чтобы проверка работала, также существует проверка в зависимости от того, является ли это массивом, массивом объектов или объектом, таким образом он будет проверять ввод для каждого типа данных.

Надеюсь, это сработает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...