Как узнать, какой из компонентов был нажат изнутри компонента

Предположим, у меня есть несколько компонентов одного типа, например:

<settings type = "first">1</settings>
<settings type = "second">2</settings>
<settings type = "third">3</settings>
<settings type = "fourth">4</settings>
<settings type = "fifth">5</settings>

Каждый из компонентов является частью «группы», называемой настройками, но каждый из них выполняет несколько разную работу - обычным явлением является то, что это элемент настройки. Теперь, поскольку каждый из них выполняет свою работу, у меня есть в "настройках" определения компонента несколько методов, но каждый метод ведет себя по-разному в зависимости от того, какой компонент был нажат:

Vue.component('settings',
    {
        template:  '<div class = "setting" @click = "selectIt">',
        props: ['type'],
        methods: {
            selectIt() {
               switch ( this.type ) {
                  case 'first':
                  console.info("first")
                  break;
                  case 'second':
                  console.info("second")
                  break;
               }
       }
   }
})

Вот и вопросы:

  • это хороший способ решить такую ​​проблему? Может быть, в каждой настройке должны быть разные компоненты?

  • как - другим способом - узнать, какой параметр был выбран изнутри компонента?

передача опоры в компонент настроек не подходит для того, что вам нужно?

af costa 07.05.2018 22:02

он работает, но во многих компонентах настроек он становится довольно беспорядочным, мне интересно, есть ли какой-нибудь лучший способ

Kalreg 07.05.2018 22:05

ну, в html вы можете использовать v-for и передать индекс компонента в качестве опоры, меньше html, и с точки зрения логики я предпочитаю делать что-то вроде case: 1 вместо case 'first'

af costa 07.05.2018 22:07

Я надеялся, что в компоненте есть какая-то внутренняя переменная, которая говорит, какой из компонентов это ..

Kalreg 07.05.2018 22:32

Есть еще один способ очистки. Просто создайте функциональный объект data () {} и назначьте его событию щелчка, и он будет запускаться только после щелчка по этому компоненту.

samayo 07.05.2018 22:37

Вы можете привести какой-нибудь пример?

Kalreg 07.05.2018 22:39

Можете ли вы объяснить, какие виды заданий выполняет этот компонент настроек?

Mahmud Adam 07.05.2018 22:45

Конечно. первый для примеров очищает базу данных от пользователей, второй перезапускает шаг игры и так далее .. они делают совершенно разные задания

Kalreg 07.05.2018 22:52
jsfiddle.net/943bx5px/233 попробуйте это отредактировать: вы можете оставить метод {}, если хотите, я уверен, что есть лучшие и более простые способы сделать это
samayo 07.05.2018 22:53
Поведение ключевого слова "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) для оценки ваших знаний,...
0
9
55
2

Ответы 2

Возможно, приведенное ниже решение будет соответствовать вашим требованиям.

Мое мнение:

  1. добавьте один prop = handlers, затем определите обработчик по умолчанию для каждого типа

  2. если родительский компонент хочет выполнить какую-то особую логику, передайте компоненту settings свой собственный обработчик. В вашем случае кажется, что родительский компонент знает, что нужно делать, а дочерний компонент - нет. Таким образом, родительская передача одного обработчика ребенку будет лучше (ребенка не волнует, что это где, просто нужно делать свою работу).

Vue.config.productionTip = false
Vue.component('settings', {
        template:  '<div class = "setting" @click = "selectIt">{{type}}</div>',
        props: {
          'type':{
            type: String,
            default:'first'
          },
          'handlers':{
            type: Object,
            default: ()=>{ return {} }
          }
        },
        data() {
          return {
            defaultHandlers: { // define your handlers for each type at here
              'first': ()=> {
                console.info('first')
              },
              'second': ()=> {
                console.info('second')
              },
              'third': ()=> {
                console.info('third')
              }
            },
            mergedHandlers: {}
          }
        },
        methods: {
            selectIt() {
               if (this.type in this.mergedHandlers) {
                this.mergedHandlers[this.type]()
               } else { // if handler not found, do something
                console.warn('handler not found')
               }
            }
       },
       mounted: function(){
        // merge customize option with default handlers
        Object.assign(this.mergedHandlers,this.defaultHandlers,this.handlers)
       }
   }
)
app = new Vue({
  el: "#app",
  data: {
    message: "Puss In Boots"
  },
  methods: {
    customHandlerForSecond: function () { // pass customized handler to child component
      console.info('parent customized second for ' + this.message)
    }
  }
})
<script src = "https://unpkg.com/[email protected]/dist/vue.js"></script>
<div id = "app">
  <settings type = "first"></settings>
  <settings type = "second" :handlers = "{'second':customHandlerForSecond}"></settings>
  <settings type = "third"></settings>
  <settings type = "fourth"></settings>
  <settings type = "fifth"></settings>
</div>

У каждого компонента есть свой идентификатор, если он вам нужен:

Vue.component('my-component', {
  template: '#my-component',
  data() {
    return {
      selected: false
    }
  },
  methods: {
    selectMe() {
      this.selected = !this.selected
      console.info(this._uid)
    }
  }
})

new Vue({
  el: '#app',
})
.card {
  background-color: #F5F5F5;
  border-radius: 8px;
  margin: 5px;
  padding: 5px 10px;
}
.selected {
  background-color: #B1B1B1;
}
<script src = "https://unpkg.com/[email protected]/dist/vue.js"></script>

<div id = "app">
  <my-component>1</my-component>
  <my-component>2</my-component>
  <my-component>3</my-component>
  <my-component>4</my-component>
  <my-component>5</my-component>
</div>

<template id = "my-component">
  <div class = "card" :class = "{'selected': selected }" @click = "selectMe">
    <slot />
  </div>
</template>

+1 это хороший вариант, но _uid - это целочисленные данные, и если оператору нужен какой-то другой формат, ему придется прибегнуть к тому же сценарию переключения.

samayo 07.05.2018 23:04

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