VueJs + Laravel - компонент кнопки типа "лайк"

Я пытаюсь получить хорошее представление о 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? (Я имею в виду, я не спрашиваю, как выполнять эти отдельные задачи, а просто где \ как это реализовать в этой ситуации). Правильно ли я понимаю логику компонента?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
1 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наверное, немного больше многословия никогда не повредит:

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, чтобы определить, понравился ли он уже. Это еще не все.

Я предполагаю, что все, что вы написали, входит в сценарий компонента, а не в основной экземпляр, в противном случае я плохо. В любом случае, я попытался присвоить опоре значение 5: <likes :now = "5"></likes> (я поставил :now, потому что он думал, что я даю строку, содержащую 5, а не число), но я все равно получаю журнал The value of 'likes' property is undefined. Я скопировал все, что вы мне дали, ни больше ни меньше, единственное в основном экземпляре Vue - это console.info, который возвращает эту ошибку (пока я не помещал часть data(), потому что хотел посмотреть, могу ли я распечатать значение свойства перешел из компонента).

K3nzie 30.10.2018 22:44

Здесь вы можете увидеть код в действии codeandbox.io/s/j1n5w345y9, как вы можете видеть в консоли, два свойства возвращают undefined

K3nzie 30.10.2018 22:56

@ K3nzie удалить mounted () { console.info("The value of 'like' property is " + this.like) }, из основного экземпляра Vue

Ohgodwhy 30.10.2018 23:03

Но ... в этом суть моего вопроса, я хотел увидеть эти значения в моем основном экземпляре (также потому, что мне нужно использовать аксиомы, и это не заставляет меня использовать его в компоненте), поэтому вы говорите мне что весь код, который вы написали, находится в тегах скриптов компонентов? Я подумал, что вы должны поместить логику в основной экземпляр new Vue({..., я имею в виду, я рассматривал компонент, как будто он должен быть просто «расширением» основного приложения (учитывая, что если вы не поместите его в область el: '#app', это не так. т ровная нагрузка).

K3nzie 30.10.2018 23:06

Кроме того, теперь, когда я думаю об этом, если я установил опору id, vue хочет, чтобы она была В шаблоне между усами, поэтому она отображается в html, но я не хочу этого, я запутался>: <ха-ха

K3nzie 30.10.2018 23:18

@ K3nzie Некоторые подходы, о которых вы говорите, на самом деле были бы другими, если бы мы имели дело со SPA. Но здесь вы имеете дело с комплексным подходом. Если вы хотите остановить FOUC, вам следует рассмотреть возможность использования директива v-cloak. Управление данными должно происходить в компоненте, а не в основном экземпляре Vue. Если вас беспокоит раскрытие id, используйте slug или uuid и обновите свой route model binding в Laravel, чтобы принять их и разрешить DI.

Ohgodwhy 30.10.2018 23:46

Спасибо :) теперь я лучше понимаю, у меня было много путаницы!

K3nzie 31.10.2018 12:39

Другие вопросы по теме