Vue.js 将样式应用于v-for使用Vuejs动态添加的HTML元素
我使用v-for将元素动态添加到列表中Vue.js 将样式应用于v-for使用Vuejs动态添加的HTML元素,vue.js,vuejs2,rangeslider,Vue.js,Vuejs2,Rangeslider,我使用v-for将元素动态添加到列表中 <ol> <li v-for="light in lights"> <input type="range" min="0" max="255" v-model="light.currentBrightness" v-on:change="setBrightness(light)" /> </li> </ol> 我想装饰滑块使用 问题是,当DOM初始化后添加
<ol>
<li v-for="light in lights">
<input type="range" min="0" max="255" v-model="light.currentBrightness" v-on:change="setBrightness(light)" />
</li>
</ol>
我想装饰滑块使用
问题是,当DOM初始化后添加新元素时,它并没有采用rangeslider.js中指定的样式。解决这个问题的方法是在rangeslider.js中调用重新初始化方法,该方法将重新装饰所有滑块元素
我不确定在运行时动态添加元素时如何调用javascript方法。有人知道怎么做吗?对我来说,这似乎是一个非常常见的问题,但我无法通过谷歌搜索找到解决方案
我的问题与中讨论的相同。如果您是JavaScript和Vue的新手,那么您已经非常接近深入了解了。RangeSloider不仅仅是样式(如CSS),它是一个替代内置范围输入的小部件 Vue背后的一个基本思想是,它控制DOM,您只需修改模型,但也存在一些精心控制的异常。组件具有允许插入和修改组件所拥有的DOM元素的位置 : 因此,对于与v-model一起工作的组件,它应该(可以是 在2.2.0+中配置:
- 接受价值道具
- 使用新值发出输入事件
值
prop。在挂载的
钩子中,我们初始化输入元素上的RangeSloider(可用作el
),然后将其设置为在更改时发出输入
事件
newvue({
el:“#应用程序”,
数据:{
灯光:[{
当前亮度:10
},
{
当前亮度:30
}
]
},
方法:{
addRange:function(){
这个。灯。推({
当前亮度:50
});
}
},
组成部分:{
范围滑块:{
道具:['value','min','max'],
模板:“”,
挂载:函数(){
var vm=这个
$(此。$el)
.val(此.value)
//初始范围滑块
.范围滑块({
polyfill:错误
})
//在更改时发出事件。
.on('change',function()){
vm.$emit('input',this.value)
})
}
}
}
});代码>
{{light.currentBrightness}
添加范围
您可以使用以下CSS代码在html5范围输入中应用一些样式:
body {
padding: 30px;
}
input[type=range] {
/*removes default webkit styles*/
-webkit-appearance: none;
/*fix for FF unable to apply focus style bug */
border: 1px solid white;
/*required for proper track sizing in FF*/
width: 300px;
}
input[type=range]::-webkit-slider-runnable-track {
width: 300px;
height: 5px;
background: #ddd;
border: none;
border-radius: 3px;
}
input[type=range]::-webkit-slider-thumb {
-webkit-appearance: none;
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: goldenrod;
margin-top: -4px;
}
input[type=range]:focus {
outline: none;
}
input[type=range]:focus::-webkit-slider-runnable-track {
background: #ccc;
}
input[type=range]::-moz-range-track {
width: 300px;
height: 5px;
background: #ddd;
border: none;
border-radius: 3px;
}
input[type=range]::-moz-range-thumb {
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: goldenrod;
}
/*hide the outline behind the border*/
input[type=range]:-moz-focusring{
outline: 1px solid white;
outline-offset: -1px;
}
input[type=range]::-ms-track {
width: 300px;
height: 5px;
/*remove bg colour from the track, we'll use ms-fill-lower and ms-fill-upper instead */
background: transparent;
/*leave room for the larger thumb to overflow with a transparent border */
border-color: transparent;
border-width: 6px 0;
/*remove default tick marks*/
color: transparent;
}
input[type=range]::-ms-fill-lower {
background: #777;
border-radius: 10px;
}
input[type=range]::-ms-fill-upper {
background: #ddd;
border-radius: 10px;
}
input[type=range]::-ms-thumb {
border: none;
height: 16px;
width: 16px;
border-radius: 50%;
background: goldenrod;
}
input[type=range]:focus::-ms-fill-lower {
background: #888;
}
input[type=range]:focus::-ms-fill-upper {
background: #ccc;
}
我不太明白这个问题,但可能的解决方案可能是在mounted()
lifecycle钩子中初始化range slider。其他方法可能是观察lights数组(我猜它是数组),当检测到更改时,可以启动初始化range slider js的方法。看看这个示例<代码>手表:{lights(){$('input[type=“range”]').RangeSlaider()}
这可能有用吗?@BelminBedak我试过手表,但没用。我想这是因为在将HTML元素添加到DOM之前调用了RangeSloider initialize。@RoyJ感谢您的示例。我对Javascript和Vuejs非常陌生,无法理解该示例中的许多部分。你有更简单的例子吗?非常感谢你花时间写这个例子。似乎我需要学习更多来充分理解这背后的概念。再次感谢!