javascript - 获取事件标签项的元素以显示边界线

标签 javascript reactjs react-hooks

我正在为选项卡组件使用 react 钩子(Hook)。我需要在事件选项卡项下方显示边框线。这仅在单击选项卡项后有效。它最初不起作用。我正在使用 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>
  );
};

这是它的codesandbox

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

如何在事件标签项下方显示边框线?

最佳答案

上述问题的解决方案需要稍微修改您的策略。我们没有使用 ActiveTabBorder 组件获取 ref 并根据元素位置呈现结果,而是使用 TabTitleItem 本身中添加边框样式:在 伪元素之后并使用 display: flex

稍微改变一下它的样式

您的 Styled 组件将如下所示

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

关于javascript - 获取事件标签项的元素以显示边界线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55997982/

相关文章:

javascript - 推送到 useReducer 状态的特定路径处的数组

javascript - React 上下文每次使用它时都会返回初始状态 - 尽管 setState

javascript - 有什么办法可以返回 split 操作中丢弃的部分吗?

javascript - 使用 mongoose 时,ForEach 循环代码无法在 Promise 中工作

javascript - 添加数据后,分页在 Kendo UI 网格中不起作用

javascript - 使用 Google Apps 脚本获取已发送文件夹中的未读计数 - GMail

reactjs - 未捕获的类型错误 : Cannot read property 'setState' of null

javascript - index.js 文件如何在 React 组件目录中工作?

javascript - 为什么 React 中视频标签上的 `muted` 属性被忽略?

reactjs - 为什么重新运行只使用react-hooks-testing-library更新一次props?