У меня есть два поля формы: страна и регион. Во-первых, вам нужно выбрать страну, а не регион. Если выбрана страна, я добавляю регионы (параметры) к следующему компоненту: Region
.
Добавляю варианты для регионов с аксиомами.
Сценарий, в котором у меня есть проблема: когда пользователь выбирает страну, затем регион возвращается, чтобы изменить страну. Необходимо сбросить регион. Я попытался сделать это с помощью хуков жизненного цикла mounted
и created
, но VeeValidate
изменений не обнаружил. Значит, значение правильно изменено, но VeeValidate
не обнаруживает этого. Я решил это, добавив watch
(с nextTick
) внутрь mounted
, но я сомневаюсь, что это хорошее решение. Есть ли у кого-нибудь другие идеи?
У меня мало опыта работы с Vue.js. Любая помощь приветствуется.
Это мой полный SelectBox.vue
:
<div>
<v-select
@input="setSelected"
:options="choices"
:filterable="filterable"
:value="value"
:placeholder="placeholder"
></v-select>
</div>
</template>
<script>
import vSelect from "vue-select";
import debounce from 'lodash/debounce';
import axios from 'axios';
//axios.defaults.headers.get["Vuejs"] = 1;
export default {
props: [
"options", "filterable",
"value", "url",
"name", "placeholder"
],
data: function () {
var choices = this.options;
if (this.name == "region") {
choices = this.$store.state["regionChoices"] || [];
if (this.value && !choices.includes(this.value)) {
this.toReset = true;
}
if ( Array.isArray(choices) && choices.length < 1) {
this.addError("region", "Country is not selected or there are not available options for your selected country.");
}
}
return {
choices: choices
// refPrefix: this.name + "Ref"
}
},
components:{
vSelect
},
inject: ["addError"],
methods: {
searchRegions: debounce((val, vm) => {
axios.get(vm.url + val)
.then(res => {
vm.$store.state["regionChoices"] = res.data.results;
});
}, 250),
setSelected(val) {
this.$emit("input", val);
if (this.name == "country") {
const countryId = val ? val.value : "0";
this.searchRegions(countryId, this);
}
},
},
mounted() {
if (this.name == "region") {
this.$watch('value', function(value) {
if (this.toReset) {
this.$nextTick(function () {
this.setSelected("");
this.toReset = value ? true : false;
});
}
}, { immediate: true });
}
},
}
</script>