假如有这样一个 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>
}} />
1
chenliangngng 15 小时 24 分钟前
你可以把组件套一层壳,然后加上你要的功能,不当公共组件
|
2
shintendo 15 小时 21 分钟前
不能让 title 可以接受 JSX.Element 吗
|
3
zhengfan2016 OP @shintendo 建议您阅读一下代码里 Content 组件,思考为什么 Content 组件会接收 Navbar 传过来的 title🤔
|
4
shintendo 14 小时 49 分钟前
@zhengfan2016 确实,没仔细看。我选择加个 titleStyle
|
5
llwxi 14 小时 35 分钟前
先用第二种实现,后续如果有两个组件使用到了,封装一个<MusicThemeColorText>{title}</MusicThemeColorText> 之类的组件?
|
6
zhengfan2016 OP |
7
zb1141920796 14 小时 14 分钟前
图省事就用 1 ,图可扩展性强一点就用 2,
|
8
snowlee 1 小时 30 分钟前
我会把 title 变成 reactNode, 相传啥就传啥
|
9
lisongeee 7 分钟前
没看懂你的操作,内部直接用 css 变量不行吗?
然后直接在目标页面给 body 设置 css 变量,离开后移除此变量 |