V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhengfan2016
V2EX  ›  程序员

前端问题,假如为一个被很多地方用的基层组件加新功能,你会怎么做

  •  
  •   zhengfan2016 · 15 小时 53 分钟前 · 596 次点击

    假如有这样一个 NavBar 组件,被 50%以上的页面使用,下面 React 简略代码

    interface NavbarProps {
      BackAction?: ({ navigation, ...rest }) => JSX.Element
      Content?: ({ title, ...rest }) => JSX.Element
      Action?: ({ ...rest }) => JSX.Element
      title?: string
    }
    
    const Navbar = (props:NavbarProps)=>{
      const {BackAction = DefaultBackAction, Content = DefaultContent, Action = DefaultAction, title, } = props || {}
        return <div className="flex flex-row">
            <BackAction {...defaultBackActionProps}>
            <Content {...{...defaultContentProps,title}}/>
            <Action {...defaultActionProps}/>
      </div>
    }
    
    // demo
    
    return <Navbar title="title" />
    

    现在你要给这个组件的 title 加一个标题为当前播放音乐主题色的功能,但是只有 1 个页面会用到这个功能

    const color = useMusicThemeColor()
    

    请问你选择哪种方案?

    1.增加一个 isMusicTheme=true ,然后把 useMusicThemeColor 放在 NavBar 内部

     <Navbar title="title" isMusicTheme={true} />
    

    2.override Content ,把 useMusicThemeColor 放当前 page

    const color = useMusicThemeColor()
    
    ...
    
     <Navbar title="title" Content={({...rest,title})=>{
     	return <div {...rest} style={{color}}>
        	{title}
        </div>
     }} />
    
    9 条回复    2024-11-01 10:18:22 +08:00
    chenliangngng
        1
    chenliangngng  
       15 小时 24 分钟前
    你可以把组件套一层壳,然后加上你要的功能,不当公共组件
    shintendo
        2
    shintendo  
       15 小时 21 分钟前
    不能让 title 可以接受 JSX.Element 吗
    zhengfan2016
        3
    zhengfan2016  
    OP
       15 小时 15 分钟前 via Android
    @shintendo 建议您阅读一下代码里 Content 组件,思考为什么 Content 组件会接收 Navbar 传过来的 title🤔
    shintendo
        4
    shintendo  
       14 小时 49 分钟前
    @zhengfan2016 确实,没仔细看。我选择加个 titleStyle
    llwxi
        5
    llwxi  
       14 小时 35 分钟前
    先用第二种实现,后续如果有两个组件使用到了,封装一个<MusicThemeColorText>{title}</MusicThemeColorText> 之类的组件?
    zhengfan2016
        6
    zhengfan2016  
    OP
       14 小时 31 分钟前 via Android
    @llwxi 没错,这就是我想看到的答案。

    但是就我观察大部分前端喜欢用 1 的写法,特别是用 1 的写法来改我的代码,把整个组件改的很臃肿,让我很不爽。
    zb1141920796
        7
    zb1141920796  
       14 小时 14 分钟前
    图省事就用 1 ,图可扩展性强一点就用 2,
    snowlee
        8
    snowlee  
       1 小时 30 分钟前
    我会把 title 变成 reactNode, 相传啥就传啥
    lisongeee
        9
    lisongeee  
       7 分钟前
    没看懂你的操作,内部直接用 css 变量不行吗?

    然后直接在目标页面给 body 设置 css 变量,离开后移除此变量
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5906 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:25 · PVG 10:25 · LAX 19:25 · JFK 22:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.