vue3-js-panel
Version:
A Vue component for jsPanel, base on vue-js-panel https://www.npmjs.com/package/vue-js-panel
207 lines (172 loc) • 4.24 kB
Markdown
## Documentation
based on the <a href="https://github.com/64robots/vue-js-panel">vue-js-panel</a>
you can check out the <a href="https://64robots.github.io/vue-js-panel/">docs</a>.
<br>
<a href="https://hsiaomingcheng.github.io/vue3-js-panel/">Demo</a>.
## install
`npm install --save vue3-js-panel`
>這是Vue3的版本,因為原本的`this.$slots.default[0].elm`在vue3上會拿到undefined所以改寫法,
解法可以參考[Vue 中怎样获取具名 slot 的 DOM 节点](https://segmentfault.com/q/1010000022089341)
---
## example
個別註冊
```javascript
<template>
<img alt="Vue logo" src="./assets/logo.png">
<div>
<button @click="triggerPanel">open panel</button>
</div>
<JsPanel :visible="obj.show" :options="options" @close="obj.show = false">
<div>123 My awesome content</div>
</JsPanel>
</template>
<script setup>
import { reactive } from 'vue'
import { JsPanel } from 'vue3-js-panel'
import 'jspanel4/dist/jspanel.min.css'
const obj = reactive({
show: false
})
const options = {
headerTitle: 'Aesome Panel'
}
const triggerPanel = () => {
obj.show = true
}
</script>
```
全域註冊
```javascript
import { createApp } from 'vue'
import App from './App.vue'
import Vue3JsPanel from 'vue3-js-panel'
import 'jspanel4/dist/jspanel.min.css'
const app = createApp(App)
app.use(Vue3JsPanel)
app.mount('#app')
```
```javascript
<template>
<img alt="Vue logo" src="./assets/logo.png">
<div>
<button @click="triggerPanel">open panel</button>
</div>
<JsPanel :visible="obj.show" :options="options" @close="obj.show = false">
<div>123 My awesome content</div>
</JsPanel>
</template>
<script setup>
import { reactive } from 'vue'
const obj = reactive({
show: false
})
const options = {
headerTitle: 'Aesome Panel'
}
const triggerPanel = () => {
obj.show = true
}
</script>
```
---
## 多開範例
```javascript
<template>
<img alt="Vue logo" src="./assets/logo.png">
<h1>vue3-js-panel</h1>
<button
v-for="item in testPanelArray"
:key="item.id"
@click="triggerPanel(item)"
>
open {{ item.content }}
</button>
<JsPanel
v-for="item in testPanelArray"
:key="item.id"
:visible="item.visible"
:options="item.options"
@close="item.visible = false"
>
<div>{{item.content}}</div>
</JsPanel>
</template>
<script setup>
import { reactive } from 'vue'
import { JsPanel } from 'vue3-js-panel'
import 'jspanel4/dist/jspanel.min.css'
const testPanelArray = reactive([
{
id: 'a-content',
content: 'A panel content',
visible: false,
options: {
headerTitle: 'A Panel'
}
},
{
id: 'b-content',
content: 'B panel content',
visible: false,
options: {
headerTitle: 'B Panel'
}
},
{
id: 'c-content',
content: 'C panel content',
visible: false,
options: {
headerTitle: 'C Panel'
}
}
])
const triggerPanel = (item) => {
item.visible = true
}
</script>
```
---
## headerToolbar slot
```javascript
<JsPanel :visible="obj.show" :options="options" @close="obj.show = false">
<div>123 My awesome contentAA</div>
<template v-slot:headerToolbar>
<div class="custom-header-toolbar">
<span>File</span> <span>Edit</span> <span>About</span>
</div>
</template>
</JsPanel>
```
---
## 這是配合slot的用法
template v-slot的`default`對應到jsPanel.vue的template的`ref`跟`name`也對應到`content`
如果將default改為testDefault,`ref`、`name`、`content`這三處也要把default改為testDefault
```javascript
<JsPanel
v-for="panel in panels"
:key="panel.component + '-' + panel.id"
:options="panel.options"
:visible="panel.show"
@close="show = false"
>
<template v-slot:default>
<component
:is="panel.component"
/>
</template>
</JsPanel>
```
```javascript
// jsPanel.vue
<template>
<div v-if="visible" ref="default">
<slot name="default"/>
<slot
v-if="false"
name="headerToolbar"
/>
</div>
</template>
{ content: this.$refs.default },
```