【发布时间】:2019-08-15 20:39:15
【问题描述】:
我正在编写一个“标签”组件。
我正在尝试在我的代码中使用sendTabsData() 方法发送数据,但由于某种原因它无法使用$emit。
这是我的标签组件代码:
<template>
<div id="tabs">
<div id="tabs-cont">
<div class="tabbable-panel">
<div class="tabbable-line">
<ul class="nav nav-tabs" role="tablist">
</ul>
<div class="tab-content">
<slot></slot>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'DashboardTabs',
props: {
tabs: {
type: Object,
required: true,
default: {}
}
},
data() {
return {
displayed: '',
tabName: '',
$tabsContainer: null,
navTabs: null,
tabContent: null
}
},
created() {
},
mounted() {
this.init();
},
watch: {
},
methods: {
init: function() {
// Fetch UI elements
this.$tabsContainer = $('#tabs');
this.navTabs = this.$tabsContainer.find('.nav-tabs');
this.tabContent = this.$tabsContainer.find('.tab-content');
this.createTabs(this.tabs);
},
// Create tabs by result
createTabs: function(tabs) {
if ( this.tabs !== undefined || this.tabs.length > 0 ) {
this.setTabsBtns(tabs);
}
},
//
tabClick: function(e) {
this.changeDisplayNames(e);
this.sendTabsData();
},
// Change display names
changeDisplayNames: function(e) {
let liItem = e['target']['dataset']['displaytable'];
if (liItem) {
// Update variable table name
this.displayed = liItem;
// Remove the '$' and 'Table' text
let tableCategory = this.displayed.replace('Table', '');
tableCategory = tableCategory.replace('$', '');
// Update "global" variable of the current table
this.tabName = tableCategory.charAt(0).toUpperCase() + tableCategory.slice(1);
}
},
// Set tabs li btns
setTabsBtns: function(tabs) {
for (let key in tabs) {
this.navTabs.append(`<li class="nav-item" @click="this.tabClick"> <a href="#tab_default_${key}" class="nav-link" data-toggle="tab" data-displayTable="${tabs[key]}"> ${tabs[key]} </a> </li>`);
}
this.navTabs.find('li:first a').addClass('active');
this.displayed = this.tabs[0];
this.tabName = this.tabs[0];
},
// Set tabs content divs - not relevant if you don't want to load extra data to the DOM
setTabsContent: function(tabs) {
for (let key in tabs) {
this.tabContent.append(`<div class="tab-pane" id="tab_default_${key}"> <table class="aTable hover display" id="${tabs[key]}"> </table> </div>`);
}
this.tabContent.find('.tab-pane').first().addClass('active');
},
hideTabs: function() {
this.$tabsContainer.slideUp('slow');
},
showTabs: function() {
this.$tabsContainer.slideDown('slow');
},
// Send tab data to parent
sendTabsData: function(){
let data = {
'tabDisplayed': this.displayed,
'tabName': this.tabName
};
this.$emit('tabsData', data);
}
}
};
</script>
这是父组件:
<script>
// import ProgressBar from "../components/ProgressBar.vue";
// import _ from 'lodash';
import DashboardForm from "../components/DashboardForm.vue";
import DashboardTabs from "../components/DashboardTabs.vue";
export default {
name: 'testcomponent',
components: {
// ProgressBar,
DashboardForm,
DashboardTabs
},
// mixins: [GF],
data() {
return {
};
},
created() {
},
mounted() {
},
destroyed() {
},
watch: {
},
methods: {
// Submit form
formSubmit: function(data) {
console.log('Submit form here');
console.log(data);
},
// Tabs data
fetchTabsData: function(data) {
console.log('tab was clicked');
console.log(data);
}
}
}
</script>
<!-- Template -->
<template>
<div id="testcomponent">
<!-- DashboardForm -->
<DashboardForm
:useGroupFilter="true"
:useDateRange="true"
@submit="formSubmit"
/>
<!-- Main Data Container -->
<div id="data-container">
<div id="chart-container"></div>
<!-- Dashboard Tabs and Tab Container -->
<DashboardTabs
:tabs="{ 0: 'potato', 1: 'banana' }"
@tabsData="fetchTabsData"
>
<!-- Datatable -->
<!-- <DashboardDatatable/> -->
</DashboardTabs>
</div>
<!-- END data-container -->
</div>
</template>
如您所见,在我的父组件中,我有一个提交发出来获取数据(并且工作正常)。
选项卡组件和表单组件之间的唯一区别是选项卡组件生成绑定了点击事件的<li>s。
所以要明确我的问题:
在这种情况下,如何使用 $emit 将数据从子组件发送到父组件 - 绑定了 click 事件的元素(onClick ==> 将数据发送/侦听到父组件)是动态自生成而不是“静态”。
编辑: 使用 v-for 似乎没有得到请求的结果:
<li class="nav-item" @click="this.tabClick" v-for="(tab,index) in tabs">
<a :href="`#tab_default_${index}`" class="nav-link" data-toggle="tab" :data-displayTable="`${tab}`"> ${tab} </a>
</li>
我得到错误:
渲染错误:“TypeError:无法读取未定义的属性‘tabClick’”
似乎不允许我添加@click
编辑2:
尝试在 v-for 中使用 @click.native="this.tabClick" - 不会导致任何错误,但我的虚拟 console.logs 不会出现。单击事件无法正常运行。
【问题讨论】:
-
欢迎来到 SO!在 Parent 上,您需要使用事件绑定
@调用方法,而不是使用属性绑定:。改一下@tabs=eventName({ 0: 'potato', 1: 'banana' })"参考代码:jsfiddle.net/varit05/5bo0w6cq/14 -
@varit05 这是用于传递可能是另一个问题的道具“标签”,请查看 JesselineTD 评论
标签: javascript vue.js ecmascript-6 vuejs2 vue-component