Я пытаюсь получить хорошее представление о VueJS, и я использую его с Laravel 5.7 для личного проекта, но я не могу точно понять, как выполнить, вероятно, простую задачу: кнопка \ значок «Нравится» .
Итак, вот ситуация: у меня есть страница, отображающая различные сообщения из моей базы данных, и в нижней части каждого сообщения я хочу кнопку «Мне нравится», которую я сделал со значком, за которым следует количество лайков в этом сообщении; Сначала кнопка будет содержать данные, полученные из соответствующей таблицы базы данных, но если вы нажмете, она увеличит отображаемое число на единицу и вставит новый лайк в базу данных.
Я сделал иконку "лайк" как компонент:
<section class = "bottomInfo">
<p>
<likes now = "{{ $article->likes }}"></likes>
<span class = "spacer"></span>
<span class = "entypo-chat">
{{ $article->comments }}
</p>
</section> <!-- end .bottomInfo -->
Как вы можете видеть, есть <likes>, в котором я добавил опору now, исходя из того, что я до сих пор понимаю в отношении компонентов, таким образом я могу вставить данные из моей базы данных в качестве начального значения (now содержит значение строки базы данных), Проблема в том, что я не знаю, где \ как сохранить это значение в моем приложении, в котором я также буду использовать аксиомы для увеличения лайков.
Вот компонент:
<template>
<span class = "entypo-heart"> {{ now }}</span>
</template>
<script>
export default {
props: ['now'],
data() {
return {
like: this.now
}
},
mounted() {
console.info('Component mounted.');
}
}
</script>
Что я пытался сделать (и я не знаю, правильно ли это), так это передать значение now функции data внутри свойства с именем like, поэтому, если я правильно понял, эта переменная like теперь является частью моих свойств в мой основной экземпляр Vue, вот этот
const app = new Vue({
el: '#main',
mounted () {
console.info("The value of 'like' property is " + this.like)
},
methods: {
toggleLike: function() {
} //end toggleLike
}
});
Функция mounted должна распечатать это значение свойства, но вместо этого я получаю
The value of 'like' property is undefined
Почему? Как это работает? Как я могу сделать так, чтобы я мог получить это значение, а также обновить его, если щелкнуть, чтобы затем выполнить запрос к моему API? (Я имею в виду, я не спрашиваю, как выполнять эти отдельные задачи, а просто где \ как это реализовать в этой ситуации). Правильно ли я понимаю логику компонента?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Наверное, немного больше многословия никогда не повредит:
props: {
now: {
type: Number,
required: true
}
}
Вместо использования функции data используйте свойство computed:
computed: {
likes: {
get: function() {
return this.now
}
}
}
Однако здесь возникает проблема.
Если вам нужно изменить количество лайков после того, как пользователь нажимает лайк, вам необходимо обновить this.now. Но ты не можешь! Это собственность, а свойства чистые. Vue будет жаловаться на mutating a property
Итак, теперь вы можете ввести data variable, чтобы определить, нажал ли пользователь эту кнопку вроде:
data() {
return {
liked: 0
}
}
Теперь мы можем обновить наше вычисленное свойство:
likes: {
get: function() {
return this.now + this.liked
}
}
Однако что нам нравится? Теперь нам понадобится еще одно свойство:
props: {
id: {
type: Number,
required: true
},
now: {
type: Number,
required: true
}
}
И добавляем метод:
methods: {
add: function() {
//axios?
axios.post(`/api/articles/${this.id}/like`)
.then (response => {
// now we can update our `liked` proper
this.liked = 1
}).catch(error => {
// handle errors if you need to
)}
}
}
И давайте убедимся, что щелчок по нашему сердцу запускает это событие:
<span class = "entypo-heart" @click = "add"> {{ now }}</span>
Наконец, нашему компоненту likes требуется свойство id из нашей статьи:
<likes now = "{{ $article->likes }}" id = "{{ $article->id }}"></likes>
Со всем этим на месте; Теперь ты волшебник, Гарри.
Редактировать
Стоит отметить, что пользователь сможет любить это всегда, снова и снова. Итак, вам нужно несколько проверок в функции click, чтобы определить, нравится ли она им. Вам также понадобится новый prop или computed property, чтобы определить, понравился ли он уже. Это еще не все.
Здесь вы можете увидеть код в действии codeandbox.io/s/j1n5w345y9, как вы можете видеть в консоли, два свойства возвращают undefined
@ K3nzie удалить mounted () { console.info("The value of 'like' property is " + this.like) }, из основного экземпляра Vue
Но ... в этом суть моего вопроса, я хотел увидеть эти значения в моем основном экземпляре (также потому, что мне нужно использовать аксиомы, и это не заставляет меня использовать его в компоненте), поэтому вы говорите мне что весь код, который вы написали, находится в тегах скриптов компонентов? Я подумал, что вы должны поместить логику в основной экземпляр new Vue({..., я имею в виду, я рассматривал компонент, как будто он должен быть просто «расширением» основного приложения (учитывая, что если вы не поместите его в область el: '#app', это не так. т ровная нагрузка).
Кроме того, теперь, когда я думаю об этом, если я установил опору id, vue хочет, чтобы она была В шаблоне между усами, поэтому она отображается в html, но я не хочу этого, я запутался>: <ха-ха
@ K3nzie Некоторые подходы, о которых вы говорите, на самом деле были бы другими, если бы мы имели дело со SPA. Но здесь вы имеете дело с комплексным подходом. Если вы хотите остановить FOUC, вам следует рассмотреть возможность использования директива v-cloak. Управление данными должно происходить в компоненте, а не в основном экземпляре Vue. Если вас беспокоит раскрытие id, используйте slug или uuid и обновите свой route model binding в Laravel, чтобы принять их и разрешить DI.
Спасибо :) теперь я лучше понимаю, у меня было много путаницы!
Я предполагаю, что все, что вы написали, входит в сценарий компонента, а не в основной экземпляр, в противном случае я плохо. В любом случае, я попытался присвоить опоре значение 5:
<likes :now = "5"></likes>(я поставил:now, потому что он думал, что я даю строку, содержащую 5, а не число), но я все равно получаю журналThe value of 'likes' property is undefined. Я скопировал все, что вы мне дали, ни больше ни меньше, единственное в основном экземпляре Vue - этоconsole.info, который возвращает эту ошибку (пока я не помещал частьdata(), потому что хотел посмотреть, могу ли я распечатать значение свойства перешел из компонента).