#javascript #vue.js
#javascript #vue.js
Вопрос:
У меня есть пользовательский ползунок диапазона, внутри которого я пытаюсь отобразить значение. Мне удалось заставить мой слайдер работать с vinila js, который у меня находится в крючке жизненного цикла ‘mounted ()’. однако, даже если я могу зарегистрировать значение из этого перехвата, оно не отображает и не обновляет значение данных.
Я довольно новичок в Vue, но я думаю, что это каким-то образом должно работать в вычисляемом объекте, но я не знаю, как я бы это сделал,
<template>
<div class="slidecontainer">
<input type="range" min="1" max="100" value="50" class="slider" id="slider" />
<div id="selector">
<div class="selector-thumb">
<p>{{rangeValue}}</p>
</div>
</div>
<div class="d-flex">
<div>
<p>R5 000</p>
<p>min</p>
</div>
<div style="margin-left:auto">
<p >R200 000</p>
<p >max</p>
</div>
</div>
</div>
</template>
<script>
export default {
data:function(){
return{
rangeValue:0
}
},
mounted(){
var slider = document.getElementById("slider");
var selector = document.getElementById("selector");
slider.oninput = function(){
selector.style.left = this.value "%";
this.rangeValue = this.value;
console.log(this.rangeValue)
}
}
};
</script>
Комментарии:
1. пожалуйста, никогда не используйте
document.getElementById(...)
пожалуйста. вы используете фреймворк, вам это не нужно2.
this.rangeValue
в вашем случае устанавливаетthis
дляslider.oninput
, а не для объекта Vue. Вместо этого используйте функцию arrow (slider.oninput = () => { /* Code here */ }
).
Ответ №1:
Попробуйте это. Не используйте document.getElementById()
или что-то в этом роде. Вы работаете с фреймворком, который вам не нужен.
<template>
<div class="slidecontainer">
<input v-model="rangeValue" type="range" min="1" max="100" value="50" class="slider" />
<div :style="{left: rangeValue '%'}" id="selector">
<div class="selector-thumb">
<p>{{rangeValue}}</p>
</div>
</div>
<div class="d-flex">
<div>
<p>R5 000</p>
<p>min</p>
</div>
<div style="margin-left:auto">
<p >R200 000</p>
<p >max</p>
</div>
</div>
</div>
</template>
<script>
export default {
data:function(){
return{
rangeValue:50
}
},
};
</script>
В случае, если вам нужно получить доступ к элементу, по какой-либо причине, потому что другого способа нет, вы должны сделать это с ref
подобным:
<div ref="myBox"></div>
и затем вы можете получить доступ к своему элементу с помощью: this.$refs.myBox
Обратите внимание: Если вы попытаетесь получить доступ к элементу в mounted
or created
, вы, вероятно, получите undefined
, потому что элемент еще не отрисован. Вам нужно будет использовать $nextTick()
, чтобы убедиться, что все отрисовано и готово к доступу.
this.$nextTick(()=> {
let element = this.$refs.myBox;
})
Он также имеет поддержку Promise
await this.$nextTick();
let element = this.$refs.myBox;
Уверен, что метод created
или mounted
должен быть асинхронным.
Ответ №2:
Ваш function()
не отслеживает this.
. В этом случае вы должны использовать функцию со стрелкой
slider.oninput = () => {
selector.style.left = this.value "%";
this.rangeValue = this.value;
console.log(this.rangeValue)
}
Это должно сохранить ссылку на this
неповрежденной и позволит вам получить доступ к вашим данным.
Редактировать: Опубликовано слишком быстро. Я не понимаю, откуда вы получаете this.value
. Оно не определено в ваших vue-данных. На этом этапе должно быть доступно только this.rangeValue
Комментарии:
1. это.значение относится к значению элемента slider