vue.js - 使 PrimeVue Splitter 具有动态双向面板尺寸

标签 vue.js vuejs3 v-model splitter primevue

我正在使用PrimeVue Splitter使用 Vue3 和组合 API。我想让每个面板的大小动态化,所以当我单击按钮时,它们会返回到原始大小。

这就是我目前所拥有的

<button @click="fixPanels()" >fix</button>

<Splitter style="height: 100%" class="mb-3">
    <SplitterPanel :size=smallPanelSize >
        Panel 1  
    </SplitterPanel>
    <SplitterPanel :size=bigPanelSize >
        Panel 2 
    </SplitterPanel>
</Splitter>


export default {  
  setup(){

    let smallPanelSize = ref(30)
    let bigPanelSize = ref(70)  
    
    const fixPanels = ()=>{   
      message.value = 30;
      bigPanelSize.value = 70
    } 

    return{smallPanelSize, bigPanelSize, fixPanels}
    
  } 
} 

我可以自由调整面板大小,但是当单击 fixPanels 时,它们不会返回到原始大小。我想我必须以某种方式使用双向绑定(bind)或 v-model 但我不知道如何,这里没有输入。如果这是不可能的,你能建议一个类似的可调整大小的面板组件,面板尺寸是动态控制的吗?

谢谢

最佳答案

SplitterPanel 组件似乎不处理 react 性大小。因此,前缀大小是在组件加载时确定的,并且无法通过 react 性重置。

因此,解决方案是重新加载组件以强制重置尺寸。

为此,我创建了一个 Panels 组件,该组件仅用于显示面板及其重置按钮。大小将通过 props 检索,而不是在组件内分配。调整大小按钮将通过 emit 发送一个事件,以便向父组件发出重新加载组件的信号,从而重置大小。

父组件将使用ref创建两个默认大小变量并将它们发送到 Prop 。还将检索该事件以调用 fixPanels 函数。唯一的微妙之处是设法强制重新加载 Panels 组件。为此,我向 Panels 组件添加了一个 key 值,每次调用 fixPanels 函数时该值都会递增。该变量的目的只是让子组件认为组件的值已更改并需要重新加载它。

下面是与我的解释相对应的两个编码组件。 (我将 Vue 3 与组合 API 和 TypeScript 一起使用,但如果需要,您可能会知道如何将其转换为 Vue 3 选项)

Panels.vue

<template>
  <button @click="$emit('reload')">fix</button>

  <Splitter style="height: 100%" class="mb-3">
    <SplitterPanel :size="smallPanelSize">
      Panel 1
    </SplitterPanel>
    <SplitterPanel :size="bigPanelSize">
      Panel 2
    </SplitterPanel>
  </Splitter>
</template>

<script setup lang="ts">

import Splitter from "primevue/splitter";
import SplitterPanel from "primevue/splitterpanel";

const props = defineProps<{smallPanelSize: number, bigPanelSize:number}>();

</script>

ManagePanel.vue

<script setup lang="ts">
import { ref } from "vue";
import Panels from "./components/Panels.vue";

let small = ref(30);
let big = ref(70);
let componentKey = ref(0);

function forceRender() {
  componentKey.value += 1;
}

function fixPanels() {
  small.value = 30;
  big.value = 70;
  forceRender();
}
</script>

<template>
  <Panels
    :smallPanelSize="small"
    :bigPanelSize="big"
    :key="componentKey"
    @reload="fixPanels"
  />
</template>

关于vue.js - 使 PrimeVue Splitter 具有动态双向面板尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72388861/

相关文章:

javascript - Vue为每个项目向下滑动过渡

vue.js - 如何将 Vue 鼠标事件与组合 api 一起使用?

vue.js - 在 Vue.js 3 中通过 Axios 调用 API 登录时如何隐藏凭据?

javascript - Vue V-Model 启动损失选择 Selection

javascript - Vue.js 2.x.x + noUiSlider : lifecycle and slider creation

javascript - Vue : const { state = {} } = this. $store 中的奇怪符号;

javascript - 在 for 循环中设置 vue.js 观察者

javascript - Vue.js 中 'data:' 、 'data: ()' 和 'data()' 之间有什么区别

json - 如何将来自 Tiptap 文本编辑器的内容放入 v-model?

javascript - 如何将 "this"以及 v-model 从输入传递到处理程序