reactjs 如何在React中覆盖CSS自定义属性?

b5lpy0ml  于 2023-02-08  发布在  React
关注(0)|答案(2)|浏览(171)

我想根据元素的子元素数动态设置元素的最大高度。
在组件中,我使用以下命令设置自定义属性:

document.documentElement.style.setProperty('--children-count', Children.count(props.children));

在我的css中,我这样使用它:

&.active {
        .buttonGroup {
            max-height: calc(var(--children-count) * 30px);
        }
    }

如果我只使用一次的话,这个方法很好用,但是,一旦我开始加载多个子组件的示例,--children-count就会被覆盖,所有前面的组件样式都会改变。
我该怎么办?

rnmwe5a2

rnmwe5a21#

这个问题很可能是因为您更改了顶部documentElement--children-count CSS变量的值,从而影响了文档中的所有组件。
如果你想要每个组件1个值,那么简单地把它应用到所述组件的元素上,参见例如如何在动态组件中的动态CSS类上应用CSS变量
如果使用styled-components,还可以使用基于属性的样式调整(而不是CSS变量)。

j9per5c4

j9per5c42#

如果您需要在多个组件之间同步公共数据,* 将状态向上拉!* 在本例中,将状态向上拉到上下文中(除非您想使用props来管理它)。
下面是一个代码箱:https://codesandbox.io/s/nervous-lalande-wjpdgb
它的关键部分是处理共享状态的上下文提供程序

function ChildCounterContextProvider({ children }) {
  const [count, setCount] = useState(0);
  const value = useMemo(() => ({ count, setCount }), [count])

  useEffect(() => {
    // Handle changes to number of children here
    document.documentElement.style.setProperty('--children-count', count);
  }, [count]);

  return <ChildCounterContext.Provider value={value}>
    {children}
  </ChildCounterContext.Provider>
}

......以及上下文使用者,后者将向它写入内容。

const useChildCounter = () => useContext(ChildCounterContext);
function MyComponentWithChildren({ children }) {
  const childrenCount = React.Children.count(children);
  const childCounter = useChildCounter();
  useEffect(() => {
    // Add when enters
    childCounter.setCount(n => n+childrenCount);
    // Deduct when exits
    return () => childCounter.setCount(n => n-childrenCount);
  }, [childrenCount, childCounter]);

  return <p>I have {childrenCount} children out of {childCounter.count}</p>
}

效果将确保计数始终同步。

相关问题