VueJS выбрать объект из списка и отобразить с функцией - PullRequest
1 голос
/ 29 мая 2020

Мне нужно получить элемент, который я нажимаю, который отображается в списке. И распечатайте этот элемент в методе, который находится в моем экземпляре vue через тег списка рассылки, который находится в индексе. html

Итак, у меня есть компонент Vue, который выполняет итерацию объекта json и только печатает два атрибута из каждого его элемента:

Vue.component('mail-list', {
  props: ['inboxmail'],
  methods: {
    selectmail: function(){
      this.$emit('selectmail', this.mail);
    }

  },
  template:
  `
  <div>
    <ul>
      <li v-for="i in inboxmail" @click="selectedmail">
      {{i.from}}:{{i.subject}}
      </li>
    </ul>
  </div>
  `
  });

После запуска в моем индексе отображаются два элемента. html:

  • test1@test.com : Привет

  • test2@test.com: Как дела?

Я хочу щелкнуть один из этих двух элементов и получить тот, который я щелкнул. Затем отправьте его vue методу setSelectedMail через тег списка рассылки, который находится в index. html

index. html:

<div id="app">
        <mail-list v-bind:inboxmail="inbox" @selectmail="setSelectedMail($event)"></mail-list>
</div>

И, наконец, вот vue экземпляр, откуда я хочу получить выбранное письмо:

let options = {
  el: "#app",
  data: {
    inbox: '',
    selectedMail:{}
  },
  methods: {
      setSelectedMail: function(mail){
          this.selectedMail = mail;
      }

  } //end methods
 }
//ViewModel (vm)
let vm = new Vue(options);

Что я делаю не так?

1 Ответ

1 голос
/ 29 мая 2020

Проверьте это. некоторые исправления в вашем коде.

@click="selectmail(i.from)"

methods: {
        selectmail: function(value) {
          this.$emit("selectmail", value);
        }
      }

Демо с вашим кодом в codeandbox или Github .

<!-- Complete code -->

<!-- MailList -->

<template>
  <div>
    <ul>
      <li v-for="i in inboxmail" @click="selectmail(i.from)" 
      v-bind:key="i.from">{{i.from}}:{{i.subject}}</li>
    </ul>
  </div>
</template>

<script>
export default {
  name: "MailList",
  props: ["inboxmail"],
  methods: {
    selectmail: function(value) {
      this.$emit("selectmail", value);
    }
  }
};
</script>

<!-- App.Vue -->

<template>
  <div id="app">
    <mail-list v-bind:inboxmail="inbox" 
      @selectmail="setSelectedMail($event)">
    </mail-list>

    Selected: {{selectedMail}}
  </div>
</template>

<script>
import HelloWorld from "./components/HelloWorld";
import MailList from "./components/MailList";

export default {
  name: "App",
  components: {
    HelloWorld, MailList
  },
  data: function(){
    return {
      inbox: [{
        from: 'test1@test.com',
        subject: 'Hi'
      },{
        from: 'test2@test.com',
        subject: 'How are you?'
      }],
      selectedMail: {}
    };
  },
  methods: {
    setSelectedMail: function(mail) {
      this.selectedMail = mail;
    }
  } //end methods
};
</script>

<style>
#app {
  font-family: "Avenir", Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...