vue 3 父子传参Demo 流式布局 手写

Posted 安果移不动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue 3 父子传参Demo 流式布局 手写相关的知识,希望对你有一定的参考价值。

成品代码在最下面

父布局 App.vue

<template>
  <p>adajk </p>

  <WaterFull :list="list"></WaterFull>
  <p>adajk </p>
</template>

<style scoped>
#app, html, body 

  height: 100%;


* 
  padding: 0;
  margin: 0;


</style>

<script setup lang="ts">


import WaterFull from "./components/water-full.vue";


const list = [
  
    height: 300,
    background: 'red'
  ,
  
    height: 400,
    background: 'pink'
  ,
  
    height: 500,
    background: 'blue'
  ,
  
    height: 200,
    background: 'green'
  ,
  
    height: 300,
    background: 'gray'
  ,
  
    height: 400,
    background: '#CC00FF'
  ,
  
    height: 200,
    background: 'black'
  ,
  
    height: 100,
    background: '#996666'
  ,
  
    height: 500,
    background: 'skyblue'
  ,
  
    height: 300,
    background: '#993366'
  ,
  
    height: 100,
    background: '#33FF33'
  ,
  
    height: 400,
    background: 'skyblue'
  ,
  
    height: 200,
    background: '#6633CC'
  ,
  
    height: 300,
    background: '#666699'
  ,
  
    height: 300,
    background: '#66CCFF'
  ,
  
    height: 300,
    background: 'skyblue'
  ,
  
    height: 200,
    background: '#CC3366'
  ,
  
    height: 200,
    background: '#CC9966'
  ,
  
    height: 200,
    background: '#FF00FF'
  ,
  
    height: 500,
    background: '#990000'
  ,
  
    height: 400,
    background: 'red'
  ,
  
    height: 100,
    background: '#999966'
  ,
  
    height: 200,
    background: '#CCCC66'
  ,
  
    height: 300,
    background: '#FF33FF'
  ,
  
    height: 400,
    background: '#FFFF66'
  ,
  
    height: 200,
    background: 'red'
  ,
  
    height: 100,
    background: 'skyblue'
  ,
  
    height: 200,
    background: '#33CC00'
  ,
  
    height: 300,
    background: '#330033'
  ,
  
    height: 100,
    background: '#0066CC'
  ,
  
    height: 200,
    background: 'skyblue'
  ,
  
    height: 100,
    background: '#006666'
  ,
  
    height: 200,
    background: 'yellow'
  ,
  
    height: 300,
    background: 'yellow'
  ,
  
    height: 100,
    background: '#33CCFF'
  ,
  
    height: 400,
    background: 'yellow'
  ,
  
    height: 400,
    background: 'yellow'
  ,
  
    height: 200,
    background: '#33FF00'
  ,
  
    height: 300,
    background: 'yellow'
  ,
  
    height: 100,
    background: 'green'
  

]


</script>

子布局

wate-full.vue

<template>
  <div class="wraps">
    <div class="items" v-for="item in waterList"
         :style="
      height:item.height+'px',
      background:item.background,
      left:item.left+'px',
      top:item.top+'px',
    ">

    </div>
  </div>
</template>

<script lang="ts" setup>

import onMounted, reactive from 'vue'

const props = defineProps<
  list: any[]
>()

const waterList = reactive<any[]>([])
const init = () => 
  const width = 130;
  //获取可视区域的宽度
  const x = document.body.clientWidth
  //math函数库中的一个函数,math.floor(x)返回小于参数x的最大整数,即对浮点数向下取整。x[]的取值。 [1]  即取整数部分。
  const cloumn = Math.floor(x / width)


  for (let i = 0; i < props.list.length; i++) 
    if (i < cloumn) 
      //第一行进行排放
      props.list[i].left = i * width;
      props.list[i].top = 10;
      waterList.push(props.list[i])
      console.log(props.list[i].top)

    

  

onMounted(() => 

  window.onresize = () => init()
  init()
);

</script>

<style lang="less" scoped>
.wraps 
  position: relative;
  height: 100%;

  .items 
    position: absolute;
    width: 120px;
  

</style>

当前效果

 需要在最短的条目上面再次拼接进去条目 然后 重新计算条目高度

 

 

完整代码

<template>
  <div class="wraps">
    <div class="items" v-for="item in waterList"
         :style="
      height:item.height+'px',
      background:item.background,
      left:item.left+'px',
      top:item.top+'px',
    ">

    </div>
  </div>
</template>

<script lang="ts" setup>

import onMounted, reactive from 'vue'

const props = defineProps<
  list: any[]
>()

const waterList = reactive<any[]>([])
//重新计算高度的数组
const waterHeight: number[] = []

const init = () => 
  const width = 130;
  //获取可视区域的宽度
  const x = document.body.clientWidth
  //math函数库中的一个函数,math.floor(x)返回小于参数x的最大整数,即对浮点数向下取整。x[]的取值。 [1]  即取整数部分。
  const cloumn = Math.floor(x / width)


  for (let i = 0; i < props.list.length; i++) 
    if (i < cloumn) 
      //第一行进行排放
      props.list[i].left = i * width;
      props.list[i].top = 0;
      waterList.push(props.list[i])
      waterHeight.push(props.list[i].height)

     else 
      //其他行的排放
//获取最小高度的索引
      const minIndex = waterHeight.indexOf(Math.min(...waterHeight))
      console.log(minIndex)

      //重新摆放
      props.list[i].left = minIndex * width;
      props.list[i].top = waterHeight[minIndex] + 20;
      //重新更新数组
      waterList.push(props.list[i])
      waterHeight[minIndex] += props.list[i].height + 20

    

  

onMounted(() => 

  window.onresize = () => init()
  init()
);

</script>

<style lang="less" scoped>
.wraps 
  position: relative;
  height: 100%;

  .items 
    position: absolute;
    width: 120px;
  

</style>

完整效果

 

以上是关于vue 3 父子传参Demo 流式布局 手写的主要内容,如果未能解决你的问题,请参考以下文章

Vue3父子组件间传参通信

vue非父子组件间传参问题

vue 父子组件传参

vue-父子组件传参以及无限级评论

vue组件传参

vue 项目中通过监听 localStorage 的变化进行父子页面传参