代码之家  ›  专栏  ›  技术社区  ›  milan

获取活动选项卡项的元素以显示边界

  •  0
  • milan  · 技术社区  · 5 年前

    我对选项卡组件使用react钩子。我需要在活动选项卡项下显示边框线。这仅在单击选项卡项后有效。它一开始不起作用。我正在使用ref获取活动选项卡项的元素,但它不起作用。我是这样做的

    const Tabs = ({ activeTab, children }) => {
      const [tabElements, setTabElements] = useState({});
      const tabsElements = useRef({});
      useEffect(() => {
        console.log("ref", tabsElements);
        setTabElements(prevState => ({
          ...prevState,
          ...tabsElements
        }));
      }, []);
      return (
        <TabsContext.TabProvider activeTab={activeTab}>
          <TabsContext.TabConsumer>
            {value => (
              <ReactTabs>
                <TabsContainer>
                  <ListTabs>
                    {value.context.tabs.map(tab => (
                      <TabTitleItem
                        key={tab.id}
                        onClick={value.context.onClick(tab)}
                        id={tab.id}
                        ref={tabElement => {
                          tabsElements.current[tab.id] = tabElement;
                        }}
                        isActiveTab={value.context.activeTab.id === tab.id}
                      >
                        <TabAnchorItem>{tab.title}</TabAnchorItem>
                      </TabTitleItem>
                    ))}
                  </ListTabs>
                  <pre>{JSON.stringify(tabElements, null, 2)}</pre>
                  <ActiveTabBorder
                    activeTabElement={
                      tabElements.current !== undefined &&
                      tabElements.current[value.context.activeTab.id]
                    }
                  />
                </TabsContainer>
    
                {children}
              </ReactTabs>
            )}
          </TabsContext.TabConsumer>
        </TabsContext.TabProvider>
      );
    };
    

    这是它的代码沙盒

    https://codesandbox.io/s/0qnvyllqpp

    如何在活动选项卡项下方显示边框线?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Shubham Khatri    5 年前

    要解决上述问题,需要稍微修改一下策略。而不是有一个 ActiveTabBorder 组件的引用并根据元素的位置呈现结果,我们在 TabTitleItem 用一个 :after 伪元素,并使用 display: flex

    您的样式化组件如下所示

    export const ListTabs = styled.ul`
      padding-left: 0;
      list-style: none;
      margin: 0;
      display: flex;
      justify-content: center;
    `;
    
    export const TabTitleItem = styled.li`
      position: relative;
      transition: all 800ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
      padding: 16px 30px;
      cursor: pointer;
      opacity: 0.4;
      display: flex;
      flex-direction: column;
      align-items: center;
      ${props =>
        props.isActiveTab &&
        `
            transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
            cursor: default;
            opacity: 1;
    
           &:after {
            content: '';
            height: 5px;
            background-color: blue;
            position: absolute;
            bottom: 0;
            transition: all 300ms cubic-bezier(0.4, 0, 0.2, 1) 0ms;
            width: 100%;
           }
    
        `}
    `;
    

    Working demo