Javascript 获取活动选项卡项的元素以显示边界
我正在为选项卡组件使用react挂钩。我需要在活动选项卡项下显示边框线。这仅在单击选项卡项后有效。它最初不起作用。我正在使用ref获取活动选项卡项的元素,但它不起作用。以下是我的做法Javascript 获取活动选项卡项的元素以显示边界,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我正在为选项卡组件使用react挂钩。我需要在活动选项卡项下显示边框线。这仅在单击选项卡项后有效。它最初不起作用。我正在使用ref获取活动选项卡项的元素,但它不起作用。以下是我的做法 const Tabs = ({ activeTab, children }) => { const [tabElements, setTabElements] = useState({}); const tabsElements = useRef({}); useEffect(() => {
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>
);
};
consttabs=({activeTab,children})=>{
const[tabElements,setTabElements]=useState({});
const tabsElements=useRef({});
useffect(()=>{
控制台日志(“参考”,选项卡);
setTabElements(prevState=>({
…国家,
…标签
}));
}, []);
返回(
{value=>(
{value.context.tabs.map(tab=>(
{
tabsements.current[tab.id]=tabElement;
}}
isActiveTab={value.context.activeTab.id===tab.id}
>
{tab.title}
))}
{JSON.stringify(tabElements,null,2)}
如何显示活动选项卡项下方的边框线?上述解决方案需要稍微修改您的策略。我们在TabTitleItem
组件中添加边框样式,而不是使用引用并根据元素位置呈现结果的ActiveTabBorder
组件:在
伪元素之后,使用显示:flex
您的样式化组件如下所示
非常感谢。我可以使用forceUpdate解决问题,但您的解决方案看起来更干净。不过,我有一个疑问,我们能否像从第一个项目移动到最后一个项目那样在边界线上产生过渡效果。我不是css专家,但我相信过渡效果可以在之后进行。不过,我不确定如何使其工作
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%;
}
`}
`;