vue js 2を使用して展開可能なアイテムを含むリストを作成しようとしています。アイテムをクリックして展開したい(コンテンツを表示する)まだ展開されていない場合は、他のすべての拡張要素を閉じます。私はexpandable-panel
とexpandable-item
という2つのコンポーネントを作成しました。内部には複数のタイプのコンテンツがあるので、スロットを使いたい。子コンポーネントが親と親に放出され、すべての子コンポーネントが更新されます
私が持っているコード:
ExpandablePanel
コンポーネント:
<template>
<div class="expandable-panel" @expanded="doStuff">
<slot></slot>
</div>
</template>
<script type="text/babel">
export default {
methods: {
doStuff: function() {
alert('expanded');
}
}
}
</script>
ExpandableItem
コンポーネント:
<template>
<div class="expandable-item" @click="toggleExpand">
<div class="expandable-item-header">
{{ title }}
</div>
<div class="expandable-item-body" v-if="expanded">
<slot></slot>
</div>
</div>
</template>
<script type="text/babel">
export default {
props: {
title: String
// expanded: {
// type: Boolean,
// default: true
// }
},
data: function() {
return {
expanded: true
}
},
methods: {
toggleExpand: function() {
this.expanded = !this.expanded;
this.$emit('expand');
}
}
}
</script>
そして、私のHTMLファイル
<expandable-panel>
<expandable-item title='title 1'>Lorem ipsum...</expandable-item>
<expandable-item title='title 2'>Lorem ipsum...</expandable-item>
<expandable-item title='title 3'>Lorem ipsum...</expandable-item>
</expandable-panel>
マイアプリおよびコンポーネントは、このように登録されています
Vue.component('expandable-panel', require('./components/global/ExpandablePanel.vue'));
Vue.component('expandable-item', require('./components/global/ExpandableItem.vue'));
const app = new Vue({
el: '#app'
});
問題: $emit
部分は、親コンポーネント内@expanded="doStuff"
に到達していないようです。 それが届いても、どうすればexpanded
の値を正しく切り替えることができますか?これに小道具を使うことはできますか?
今は各要素を切り替えますが、他の要素は更新できません。 はExpandablePanel
コンポーネントでは、あなたに
はい、あなたは小道具を介してそれを制御することもできますし、この目的のために[vuex](https://vuex.vuejs.org/ja/)のような状態管理を探ることもできます。 – Saurabh