React之卡片拖拽移动

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React之卡片拖拽移动相关的知识,希望对你有一定的参考价值。

参考技术A 管理页面我们通常能看到一连串的卡片,以很明显的方式对用户进行提示,也可以是图表嵌在卡片的形式直观展示。那就会存在一个需求,用户可以自定义自己想要的卡片布局,其实也就是自定义宽高这样。

可以看到这里监听了页面的 resize ,然后进行 onWindowResize 方法,我们在其他页面进行 resize 之后,也会触发这个方法,这也是我前面要强调一下路由切换不会 unmount 的原因,这里的 resize 没法得到正确的 node.offsetWidth ,所以样式错乱了,那怎么办呢?

首先我想着,在这个页面写一个时钟,不停的 js 去触发 resize 事件,让它在切换页面的时候重新计算,这样肯定是ok的,但是这样肯定会有性能问题,因为不停的延时调用,这样我就得想个办法,不那么频繁的刷新了,怎么做呢?

路由切换,页面也切换了,那组件肯定会触发 receiveProps 钩子,那我在这里判断一下当前页面的路由,如果是当前路由,那就刷新一下(dispatchEvent('resize')),这样就做到只是进入这个页面就刷新,比时钟要好一些。但是这样还是很low,因为进入其他页面没有 resize 操作,只要返回这个页面就会刷新,接下来我就要优化一下,只有当其他页面 resize 了之后,回到当前页才 dispatchEvent('resize') 。

页面挂载的时候就进行 resize 监听,当发生 resize 事件之后进行一下路由判断,如果是其他页面,就改变 state 里的一个值,返回到当前页之后进行一下 state 的值判断,为 true 才刷新。

为了页面切换的时候更合理一些(不展示错乱的页面),加个 loading 延时一秒过度一下,还要记得 unmount 时去除掉 resize 监听。

这里的图表用的是 bizcharts ,它会监听页面 resize 的变化,但是当我们改变宽高的时候,发现没有自适应,一开始我的解决方法是把这个渲染的 canvas 设置为 width:100% ,这样能使它拉伸开,但是很丑,因为是相当于是放大,这样效果太不好了,所以也要解决这个问题。

React-Grid-Layout 组件有一个 props , onResize 事件返回当前改变宽高这样的事件回调,我们在这个回调里手动触发一下页面 resize 事件,以实现 bizcharts 的自适应。

文章链接: https://www.npmjs.com/package/react-grid-layout

React strap 卡无法根据屏幕大小对齐项目

【中文标题】React strap 卡无法根据屏幕大小对齐项目【英文标题】:React strap Cards unable to align items according to the screen size 【发布时间】:2020-09-28 07:30:25 【问题描述】:

我正在使用 React 卡片来显示动态卡片。我想在一行中显示 4 张用于桌面视图的卡片和 1 张用于移动视图的卡片,但它总是垂直显示,没有水平显示卡片

卡片的容器组件

    import React from 'react'
    import SongCard from '../SongCard'
    import 
        CardDeck
     from 'reactstrap';

    function Popular( popular ) 
        return (
            <div>
                popular.map((post) =>
                    <div key=post.etag>
                        
                            <CardDeck style=display: 'flex', flexDirection: 'row',justifyContent: 'right'>
                                <SongCard
                                    Title=post.snippet.title
                                    VideoId=post.id.videoId
                                    Image=post.snippet.thumbnails.high.url
                                    ChannelTitle=post.snippet.channelTitle />
                            </CardDeck>
                        
                    </div>)
                
            </div>
        )
    

    export default Popular

而卡片组件是

    import React from 'react'
    import 
        Card, CardImg, CardText, CardBody,
        CardTitle, CardSubtitle
     from 'reactstrap';

    function SongCard( Title, VideoId, Image, ChannelTitle ) 
        return (
            <div>
                <Card style=maxWidth:'30em',flex: '1'>
                    <CardImg top  src=Image  />
                    <CardBody>
                        <CardTitle>Title</CardTitle>
                        <CardSubtitle>ChannelTitle</CardSubtitle>
                        <CardText></CardText>
                    </CardBody>
                </Card>
            </div>
        )
    

    export default SongCard

【问题讨论】:

【参考方案1】:

首先,在 SongCard 中,您可能不需要将卡片组件封装在 div 中,这会使您的 Card 样式不可用,因为 div 默认为全宽度。

其次,CardDeck 应该在地图循环之外,因为您为每个帖子创建一个新的 CardDeck,它可能不是您想要的。而是将“key=post.etag”直接放在 SongCard 中。

我也不建议在 CardDeck 的 style 中添加自定义样式,因为你会破坏所有设备的默认布局。

    import React from 'react'
import SongCard from '../SongCard'
import 
    CardDeck
 from 'reactstrap';

function Popular( popular ) 
    return (
        <CardDeck>
            popular.map((post) =>
                            <SongCard
                                key=post.etag
                                Title=post.snippet.title
                                VideoId=post.id.videoId
                                Image=post.snippet.thumbnails.high.url
                                ChannelTitle=post.snippet.channelTitle />
                </div>)
            
       </CardDeck>
    )


export default Popular

   import React from 'react'
import 
    Card, CardImg, CardText, CardBody,
    CardTitle, CardSubtitle
 from 'reactstrap';

function SongCard( Title, VideoId, Image, ChannelTitle ) 
    return (
            <Card>
                <CardImg top src=Image  />
                <CardBody>
                    <CardTitle>Title</CardTitle>
                    <CardSubtitle>ChannelTitle</CardSubtitle>
                    <CardText></CardText>
                </CardBody>
            </Card>
    )


export default SongCard

【讨论】:

已编辑,有这样的新东西吗?

以上是关于React之卡片拖拽移动的主要内容,如果未能解决你的问题,请参考以下文章

React版移动端滑动

js面向对象开发之--元素拖拽

react 表格单元格拖拽

javascript 拖拽移动滚动条

React strap 卡无法根据屏幕大小对齐项目

React.js实现原生js拖拽效果及思考