我正在尝试创建一个自定义钩子,它将为我们处理一些 Aphrodite ( https://github.com/Khan/aphrodite ) 样式的合并,但是在传入样式对象时我遇到了一些不寻常的行为。
这是我的钩子:(计划是用 useMemo 组成,这就是为什么它是一个钩子)
import castArray from 'lodash/castArray';
import {StyleSheet} from 'aphrodite';
import merge from 'lodash/merge';
export const useStyles = (styles, props) => {
return {
styles: StyleSheet.create(
[...castArray(styles), ...castArray(props.styles)]
.reduce((agg, next) => (merge(agg, next))),
)
};
};
以及基本用法:
function TestComponent(props) {
const {styles} = useStyles(baseStyles, props);
return <div className={css(styles.test)}>Test Text</div>
}
想法是,如果styles
传入一个 prop,它将与 baseStyles 中的任何内容合并,并给出最终的 Aphrodite Stylesheet 用于该组件实例。
我在这里创建了一个简单的 repro 存储库:https ://github.com/bslinger/hooks-question
预期:在两条路线之间单击会改变文本的颜色,具体取决于是否已传入道具以覆盖该样式。
实际:一旦样式被合并,即使没有传入额外道具的路线也会以覆盖的颜色显示它。
注意:我意识到在删除 useMemo 之后,这在技术上甚至不是一个钩子,并且将 React 降级到 16.7 会导致相同的行为,所以我猜这毕竟只是一个 Javascript 或 React 问题?