#vue.js #vuex
#vue.js #vuex
Вопрос:
Я новичок в VueJS.(vue 2). У меня здесь проблема. У меня есть таблица, в которую я динамически заполняю данные, подобные этому.
<tbody>
<tr v-bind:key="queProduct.value" v-for="queProduct in queueProducts">
<td class="has-text-centered">
<figure class="image is-48x48">
<img :src="queProduct.image" alt="Placeholder image">
</figure>
</td>
<td><span>{{queProduct.title}}</span></td>
<td class="has-text-centered"><a class="has-text-link">
<span class="icon is-size-4" @click="openModalPopup(queProduct.id)">
<i class="fa fa-edit" />
</span>
</a>
</td>
<td class="has-text-centered"><a class="has-text-link">
<span class="icon is-size-4" @click="openModalPopup(queProduct.id)">
<img :src="queProduct.indicatorImg" />
</span>
</a>
</td>
<td class="has-text-centered"><a class="delete is-large has-background-link" @click="removeFromQueue(queProduct.id)"></a></td>
</tr>
</tbody>
methods:{
loadQueue(){
const indicators = store.get('productIndicators');
if(indicators === undefined){
store.set('productIndicators', []);
} else {
this.savedProprogressIndicators = indicators;
}
this.queueProducts.forEach(product => {
product.indicatorImg = indicatorImgBaseUrl 'Level-0.png';
this.savedProprogressIndicators.forEach(indicator => {
if(indicator.id === product.id){
product.indicatorImg = indicatorImgBaseUrl indicator.image;
}
})
})
}
}
Когда я запускаю консоль.регистрируйте продукт, я вижу, что объект product обновляется с новым значением. Но dom не обновляется. Нравится,
this.product выглядит следующим образом.
{
id: "d6dd8228-e0a6-4cb7-ab83-50ca5a937d45"
image: "https://zuomod.ca/image/cache/catalog/products/2018/Single/medium/50105-1-800x800.jpg"
inQueue: false
indicatorImg: "https://cdn.shopify.com/s/files/1/0003/9252/7936/files/Level-2.png"
saved: false
sku: "50105"
title: "Interstellar Ceiling Lamp"
}
Но в DOM это выглядит следующим образом
{
id: "d6dd8228-e0a6-4cb7-ab83-50ca5a937d45"
image: "https://zuomod.ca/image/cache/catalog/products/2018/Single/medium/50105-1-800x800.jpg"
inQueue: false
indicatorImg: "https://cdn.shopify.com/s/files/1/0003/9252/7936/files/Level-0.png"
saved: false
sku: "50105"
title: "Interstellar Ceiling Lamp"
}
Не могли бы вы, пожалуйста, помочь мне решить эту проблему?
Спасибо, Vandanaa
Комментарии:
1. Не могли бы вы предоставить код, который возвращает queueProducts ?
2. У меня есть queueProducts, объявленные в разделе data, подобном этому ` data() { return { queueProducts:[] } }`, и заполняемые в функции загрузки, подобной этому ` this. queueProducts = store.get(‘queueProducts’);`
3. Привет, Ванданаа. Прав ли я, полагая, что вы также используете Vuex в своем проекте, или вызов ‘store’ является чисто случайным? Просто хотел уточнить это, прежде чем продолжить.
4. Я думаю, что это, хранилище связано с vues
5. да, я использую хранилище electron, поскольку это приложение vue-electron
Ответ №1:
Поскольку вы используете Vuex, вы должны получать свои продукты непосредственно из своего хранилища, как в вычисляемом свойстве в вашем определении vue. Это обновит данные непосредственно из хранилища без каких-либо действий со стороны vue.
{
...
computed:{
...mapGetters({
queueProducts : 'queueProducts'
})
}
...
}
Кроме того, если вы используете vuex, постарайтесь сохранить свою логику внутри вашего хранилища. Ваш vue должен отображать только данные.
Загляните в документацию vuex, чтобы узнать, когда и где вам следует использовать геттеры, мутации и действия.
Надеюсь, это поможет.
Ответ №2:
this.queueProducts.forEach(product => {
...
...
...
}
this.$forceUpdate(); // Trying to add this code
Я предположил, что ваш product.indicatorImg не был просмотрен Vue, поэтому он не обновит DOM. Пытаюсь добавить this.$forceUpdate()
в конце. Это заставит Vue обновить DOM.