Как обновить данные на странице ajax + vue + vuex?

195
16 февраля 2019, 06:30

Как правильно сделать добавление отзывов? При сабмите формы хочу добавить отзыв, отобразить на странице и очистить поля в форме. Как это можно реализовать ?

Мой вариант: В beforeCreated получить все отзывы c сервера и отобразить их на странице.Создать массив в store и в него записывать данные, которые нужно отобразить после сабмита формы.Но тогда появляется проблема, данные в форме продолжают быть привязаны к массиву т.е. очистить поля не получится. Как можно решить данную проблему ? Код моего варианта ниже:

export default { 
  data() { 
    return { 
      review: { 
        userName: '', 
        reviewText: '' 
      } 
    }, 
    methods: { 
        sendReview() { 
          this.$store.dispatch('postReview', this.review) 
        } 
      }, 
      computed: { 
        reviews() { 
          return this.$store.getters.getReviews 
        } 
      }, 
      beforeCreate() { 
        this.$store.dispatch('loadReviews') 
      } 
  } 
  // vuex store 
  import Vue from 'vue'; 
 
  export default { 
    state: { 
      reviews: [] 
    }, 
    getters: { 
      getReviews(state) { 
        return state.reviews 
      } 
    }, 
    mutations: { 
      updateReviews(state, data) { 
        state.reviews = data; 
      }, 
      addNewReview(state, data) { 
        state.reviews.push(data); 
      }, 
    }, 
    actions: { 
      loadReviews({ 
        commit 
      }) { 
        Vue.http.get('url.json') 
          .then(res => { 
            return res.json() 
          }) 
          .then(data => { 
            commit('updateReviews', data) 
          }) 
      }, 
      postReview({ 
        commit 
      }, payload) { 
        Vue.http.post('url', payload) 
          .then(() => { 
            commit('addNewReview', payload) 
          }) 
      } 
    } 
  }
<template> 
	<div class="container"> 
		<h1>Отзывы</h1> 
		<form  
			@submit.prevent="sendReview"> 
				<input  
					v-model="review.userName" 
					type="text"  
					placeholder="Имя" > 
				<textarea  
					v-model="review.reviewText" 
					placeholder="Отзыв" 
					cols="30"  
					rows="3"> 
				</textarea> 
			<input  
				type="submit" > 
		</form> 
		<ul> 
			<li v-for="item in reviews"> 
				<h2>{{item.userName}}</h2> 
				<p>{{item.reviewText}}</p> 
			</li> 
		</ul> 
	</div> 
</template>

Answer 1

Решил проблему следующим образом: т.е. теперь данные не зависят от v-model

class Review { 
  constructor(user, text) { 
    this.userName = user 
    this.reviewText = text 
  } 
} 
 
sendReview() { 
  const review = { 
    userName: this.review.userName, 
    reviewText: this.review.reviewText 
  } 
  this.$store.dispatch('postReview', review) 
    .then(() => { 
      this.review.userName = ''; 
      this.review.reviewText = ''; 
    }) 
}

READ ALSO
Добавить в таблицу колонку array

Добавить в таблицу колонку array

Какой должен быть запрос к БД, чтобы можно было создать колонку для хранения тэговПодумал что можно сделать так:

153
MYSQL Как выполнить триггер в процедуре и через PREPARE?

MYSQL Как выполнить триггер в процедуре и через PREPARE?

Подскажите, пожалуйстаДелаю так

134
Как правильно использовать MySql?

Как правильно использовать MySql?

Я юзаю денвер и захожу в phpmyadmin http://localhost/Tools/phpMyAdmin/но как я понимаю эти базы данных, которые я создаю они остаются на этом компьютере и с другого...

162
Мониторинг нагрузки на таблицы в MySQL

Мониторинг нагрузки на таблицы в MySQL

Можно ли как-то в режиме онлайн отслеживать нагрузку на все или отдельные таблицы MySQLЦель: отследить, какая именно таблица при накате обновлений...

158