Как использовать prop внутри другого prop в качестве значения по умолчанию в vuejs

#javascript #vue.js

#javascript #vue.js

Вопрос:

Я использую этот пакет из git hub для ввода минус плюс для vuejs, а в папке v2, например, есть пример файла с именем plusminusfield.vue, и это то, что я использовал для его использования :

  export default {
    props: {



        value: {
            default: 0,
            type: Number
        },
       base_capacity: {
            type: Number,
            required: true
        },
        min: {
             default: here I want to use the sent variable which is defined above and that is base_capacity 
 if I send a hard code like 5 it works well but I want to make it dynamic
             type:Number
        },
        max: {
            default: 22,
            type: Number
        },
    },
    data(){
        return {

            newValue: this.base_capacity,
        }
    },
  

и вот методы для минус плюс числа входных данных и управления максимальными и минимальными значениями :

 methods:{
        getNotificationClass (notification) {
            return `alert alert-${notification.type}`
        },
        mpminus: function () {
            if ((this.newValue) > this.min) {
                this.newValue = this.newValue - 1
                this.$emit('input', this.newValue)
            }

        },
        mpplus: function () {
            if (this.max === undefined || (this.newValue < this.max)) {
                this.newValue = this.newValue   1
                this.$emit('input', this.newValue)
            }
        },

    },
 watch: {
        value: {
            handler: function (newVal, oldVal) {
                this.newValue = newVal
            }
        }
    },
  

итак, если я определяю его где-либо еще и использую его в props, я получаю ошибку mutant, которую родительский компонент изменяет, и мое приложение не запускается, и если я использую вычисленное, как показано ниже, я комментирую ошибку перед ними :

 computed: {
           min() {
             return this.min ? this.min : this.base_capacity //Maximum call stack size exceeded
         }
        min : this.base_capacity // the error is base_capacity not defined
    },
  

итак, есть ли какой-либо способ, которым я передаю min для этого ввода из

Комментарии:

1. Вы можете сделать this.newValue = this.base_capacity в created (или mounted ) перехватчике.

2. Я не верю, что было бы возможно установить значение по умолчанию для одного prop на значение другого prop.

3. @Farshad Это другая ошибка. Это потому, что вы меняете min значение prop где-то еще в своем коде. Возможно, вы установили модель ввода в min , чего не должно быть

4. Вы могли бы попробовать использовать возврат с помощью функции, но я здесь просто предполагаю, например : default: () => { return this.base_capacity; }

5. на данный момент этого нет, компонент еще не инициализирован.

Ответ №1:

Хотя принятый ответ будет работать для Vue 2.x, в Vue 3.x заводские функции prop по умолчанию больше не имеют доступа к this . Вместо этого вы можете передать props компонента в качестве аргумента функции factory:

 props: {
  ...
  baseCapacity: {
    default: 0,
    type: Number
  },
  min: {
    default: (props) => props.baseCapacity,
    type: Number
  },
  ...
},
  

Смотрите руководство по миграции: https://v3-migration.vuejs.org/breaking-changes/props-default-this.html

Комментарии:

1. Имейте в виду, что порядок важен, в приведенном выше примере, если min он должен был появиться раньше baseCapacity , props.baseCapacity было бы undefined .

Ответ №2:

Вместо того, чтобы использовать его напрямую, используйте заводскую функцию и возвращайте значение.

кроме того, атрибуты HTML чувствительны к регистру.

Пример: Если вы установите атрибут как: base-capacity , Vue автоматически преобразует его в верблюжий регистр as baseCapacity для доступа к нему из скрипта.

Вот официальные документы

 Vue.component('plus-minus', {
  template: '#vplusminus',
  props: {
    value: {
      default: 0,
      type: Number
    },
    baseCapacity: {
      default: 0,
      type: Number
    },
    min: {
      default: function () {
        return this.baseCapacity 
      },
      type: Number
    },
    max: {
      default: undefined,
      type: Number
    }
  },
  data() {
    return {
      newValue: 0
    }
  },
  methods: {
    getNotificationClass(notification) {
      return `alert alert-${notification.type}`
    },
    mpplus: function() {
      if (this.max === undefined || (this.newValue < this.max)) {
        this.newValue = this.newValue   1
        this.$emit('input', this.newValue)
      }
    },
    mpminus: function() {
      console.log(this.min); // Here it is coming as 12
      if ((this.newValue) > this.min) {
        this.newValue = this.newValue - 1
        this.$emit('input', this.newValue)
      }
    }
  },
  watch: {
    value: {
      handler: function(newVal, oldVal) {
        this.newValue = newVal
      }
    }
  },
  created: function() {
    this.newValue = this.value
  }
});

new Vue({
  el: '#app'
});  
 .minusplusnumber {
  border: 1px solid silver;
  border-radius: 5px;
  background-color: #FFF;
  margin: 0 5px 0 5px;
  display: inline-block;
  user-select: none;
}

.minusplusnumber div {
  display: inline-block;
}

.minusplusnumber #field_container input {
  width: 50px;
  text-align: center;
  font-size: 15px;
  padding: 3px;
  border: none;
}

.minusplusnumber .mpbtn {
  padding: 3px 10px 3px 10px;
  cursor: pointer;
  border-radius: 5px;
}

.minusplusnumber .mpbtn:hover {
  background-color: #DDD;
}

.minusplusnumber .mpbtn:active {
  background-color: #c5c5c5;
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<div id="app">
  <plus-minus :base-capacity="12" :value="16"></plus-minus>
  <plus-minus></plus-minus>
</div>

<script type="template/text" id="vplusminus">
  <div class="minusplusnumber">
    <div class="mpbtn minus" v-on:click="mpminus()">
      -
    </div>
    <div id="field_container">
      <input type="number" v-model="newValue" disabled />
    </div>
    <div class="mpbtn plus" v-on:click="mpplus()">
       
    </div>
  </div>
</script>  

Комментарии:

1. github.com/manjufy/v-minusplusinput это компонент, который я использую, я не понял, каков твой ответ, братан

2. Обновил ответ, насколько я понял вопрос. вам нужно установить значение по умолчанию для min в base_capacity, поэтому, если вы нажмете на минус, вы получите минимальное значение как 12, т. е. заданное в base-capacity из компонента.

3. Я установил :value значение 16 , и теперь, если вы нажмете на кнопку минус, вы сможете получить значение till, 12 поскольку значение min установлено на 12 сейчас.

4. Прохладный. Приятно слышать!

5. Это реактивно?

Ответ №3:

Вы не должны использовать другое prop в качестве значения по умолчанию. Даже если они доступны, у вас нет гарантии относительно порядка, в котором вычисляются prop.

Лучший подход — использовать вычисляемое свойство, которое учитывает оба props, и использовать его внутри вашего компонента.

 computed: {
   minComputed () {
     return this.min ? this.min : this.base_capacity
   }
}
  

Кроме того, удалите default значение из определения min

Комментарии:

1. взгляните на эту ссылку, это входные данные github.com/manjufy/v-minusplusinput у него есть параметры минимального значения и максимального, теперь, что я хочу сделать, это установить min в отправленную переменную из laravel, я просто хотел лучше доработать себя 🙂

2. Понял, ваша проблема связана с тем фактом, что вы пытаетесь установить значение по умолчанию для min равным base_capacity. Но ваш подход не сработает. Вам нужно определить вычисляемое свойство min и основывать его на значении props min и base_capacity. В итоге вы получите желаемую функциональность.

3. это ваш ответ?? но когда я попробовал это, я снова получил ошибку, поэтому попробуйте еще раз

4. Я отредактировал свой ответ, вам также необходимо удалить значение по умолчанию из определения min.

5. я думаю, что важно добавить эту функцию к нему для минус mpminus: function () { if ((this.newValue) > this.min) { this.newValue = this.newValue — 1 this.$emit(‘input’, this.newValue) } так что, если вы не установите min, это не сработает, и это не будет уменьшать что-либо, теперь это так, я не получаю ошибку, но это не будет работать