react实现横向列表超出部分隐藏,点击按钮可以左右切换

一、需求

实现的功能为:最大黑色框内为可视区,其余黑框为需展示的列表,列表超出部分隐藏。

                         红色圆圈为左右切换按钮,当页面初始加载时,左侧红色按钮隐藏,右侧红色按钮根据列表宽度及可视区宽度判断是否应该显示:当列表宽度超出可视区范围时,显示右侧红色按钮,且点击之后可以切换下一个列表内容,同时左侧红色按钮也相应显示;当列表宽度小于可视区范围时,两侧按钮均不展示(如果有点击某个按钮可以添加列表项的需求时,当整体列表项宽度大于可视窗宽度,按钮也相应的显示)。

 二、思路分析

  1. 在页面初始加载时需获取可视窗宽度(clientWidth)(对应生命周期componentDidMount)
  2. 获取展示列表宽度(假设列表名称定义为list,则对应列表宽度为list.width)
  3. 页面布局时设置每个列表项宽度为固定值(假定为300px)
  4. 每个列表项之间的margin(假定为15px)
  5. 要使得整个列表可以移动,则需要操作DOM,并设置css样式,有两个样式可以实现列表的移动:1.tranform,设置translateX的值不断变化,则可以实现列表项的移动2.绝对定位,设置left或right的值不断变化。         在这里我使用的方法为使用transform实现列表的移动。
  6. 因为要判断切换按钮是否显示,所以需要明显显示的边界条件
  • 左侧按钮:页面初始加载时一定不显示(初始时列表未移动)
  • 右侧按钮:页面初始加载时,根据列表宽度与可视区范围时判断右侧按钮是否显示(当有添加按钮时,根据列表长度的变化判断按钮是否显示)

三、代码实现

整体我只写页面HTML,React逻辑部分,css部分自己可以根据自己需求进行布局,注意整个list可视区部分需设置overflow:hidden

1.定义列表项

const list = [
    { key: '1', month:"列表项1"},
    { key: '2', month:"列表项2"},
    { key: '3', month:"列表项3"},
    { key: '4', month:"列表项4"},
    { key: '5', month:"列表项5"},
  ]

2.html部分

      //这里img使用绝对定位定位在整个list上方
     { leftIconVisible && <img  src={""}  onClick={()=>onIconClick("left")} />  }
      <div
            className={style.list}
            id="list"
            style={{ transform: `translateX(${translateX}px)` }}
          >
            {list.map((item) => {
              const { key, name } = item
              return (
                <div
                  key={key}
                  className={style.listItem}
                >
                    {name}
                  </div>
              )
            })}
          </div>
     { rightIconVisible && <img  src={""}  onClick={()=>onIconClick("right")} />  }

3.react逻辑部分


  const [listWidth, setListWidth] = useState(0)
  const [translateX, setTranslateX] = useState(0)
  //使用useMemo计算左右按钮是否隐藏
  const [leftIconVisible, rightIconVisible] = useMemo(() => {
    const listItemWidth = list.length * 315
    const isLeftIconVisible = translateX >= 0
    const isRightIconVisible =
      listItemWidth < listWidth ||
      listItemWidth + translateX <= listWidth
    return [isLeftIconVisible, isRightIconVisible]
  }, [list, translateX, listWidth])
  useEffect(() => {
    const list = document.getElementById('list') as HTMLElement
    setlistWidth(list.clientWidth)
  }, [])
  const onIconClick = (direaction: string) => {
    const translateStep = 315
    let newTranslateX: number = translateX
    const translateDistance: number =
      translateStep * (direaction === 'left' ? 1 : -1)
    // 点击箭头
    if (translateDistance > 0) {
      if (leftIconVisible) return
      else {
        newTranslateX += translateDistance
      }
    } else if (translateDistance < 0) {
      if (rightIconVisible) return
      else {
        newTranslateX += translateDistance
      }
    }
    setTranslateX(newTranslateX)
  }

点击按钮切换scss变量react是指在React项目中,通过点击按钮切换应用中使用的scss变量。 在React中,我们可以使用state来保存和管理页面中的状态。所以,我们可以创建一个按钮组件,通过点击按钮来改变其中的scss变量。 首先,在项目中引入所需的scss文件,并创建一个变量文件来保存需要切换的scss变量。 然后,创建一个按钮组件,并在其中定义一个状态变量来保存当前的scss变量: ``` import React, { useState } from "react"; import "./styles.scss"; const Button = () => { const [theme, setTheme] = useState("default"); const handleThemeChange = () => { // 根据当前的主题切换到另一个主题 if (theme === "default") { setTheme("alternative"); } else { setTheme("default"); } }; return ( <button onClick={handleThemeChange} className={theme}> 切换主题 </button> ); }; export default Button; ``` 在上面的例子中,我们创建了一个按钮组件,使用useState来定义了一个名为theme的状态变量,默认值为"default"。在handleThemeChange函数中,我们通过判断当前的theme值来切换到另一个主题。然后,在render函数中,我们将这个theme值作为classname应用到按钮上。 最后,在项目的主文件中引入刚刚创建的按钮组件: ``` import React from "react"; import Button from "./Button"; const App = () => { return ( <div> <h1>点击按钮切换scss变量React</h1> <Button /> </div> ); }; export default App; ``` 上述代码中,我们创建了一个App组件,并在其中使用了刚刚创建的按钮组件Button。 这样,当我们点击按钮时,按钮组件的状态会发生改变,从而切换到另一个scss变量,并且页面中使用该变量的样式会跟着改变。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值