开发者问题收集

TypeError:无法读取未定义的属性(读取‘style’)

2021-10-13
7915

调试这个问题已经很久了。我试图让一组项目在单击时发生更改,但使用变换,但“样式”未定义。我还包含了卡片组件函数。非常感谢您的帮助

import React,{useRef} from 'react';
import { Card } from '../components';
import { CardItemContainer } from './card-item';

export function CardContainer() 
 {


const listRef=useRef()

const handleClick=(direction)=>
{
    if(direction==="left")
    {
         listRef.current.style.transform=`translate(230)`

    }
}

    return(
        <Card>
        
            <Card.ListTitle> Continue to watch</Card.ListTitle>
            <Card.Wrapper >
                <Card.ArrowSliderLeft onClick={()=>handleClick('left')}/>
                <Card.List ref={listRef}> 
                  <CardItemContainer index={0}/>
                  <CardItemContainer index={1}/>
                  <CardItemContainer index={2}/>
                  <CardItemContainer index={3}/>
                  <CardItemContainer index={4}/>
                  <CardItemContainer index={5}/>
                  <CardItemContainer index={6}/>
                  
                </Card.List>
                <Card.ArrowSliderRight  onClick={() => handleClick("right")}/>
            </Card.Wrapper>
        </Card>
    )
}

卡片组件

import {ArrowBackIosOutlined,ArrowForwardIosOutlined} from "@material-ui/icons";
import React, {} from 'react';

import {
    Container,
    List,
    ListTitle,
    Wrapper,
    ArrowSliderLeft,
    ArrowSliderRight 

} from './styles/card';

 export default function Card({ children, ...restProps }) {

    return <Container {...restProps}>{children}</Container>
  }


Card.ListTitle=function CardListTitle({children,...restProps})
{
    return <ListTitle{...restProps}> {children} </ListTitle>
}

Card.Wrapper=function CardWrapper({children,...restProps})
{
   
    return <Wrapper{...restProps} > {children} </Wrapper>

}

Card.List=function CardList({children,...restProps})
{
     return <List{...restProps} >{children}</List>
}

Card.ArrowSliderLeft = function HeaderArrowBackIosOutlinedSymbol({...restProps })
 {
    return <ArrowSliderLeft {...restProps }>
        {/*id allows me to style the icon directly */}
                <ArrowBackIosOutlined id="sliderLeft"/> 
           </ArrowSliderLeft>
}

   

Card.ArrowSliderRight = function HeaderArrowForwardIosOutlinedSymbol({...restProps}) {
 
  
  return (
    <ArrowSliderRight {...restProps}>
      <ArrowForwardIosOutlined id="sliderRight"/>
    </ArrowSliderRight>
  );
};

忽略 : 调试这个问题已经很久了。我试图让一组项目在单击时发生更改,但使用变换,但“样式”未定义。我还包含了卡片组件函数。非常感谢您的帮助

2个回答

CardList 这样的函数组件没有 ref 属性,只有类组件或 DOM 元素才有。

您还没有发布 List 组件的实现,但我们假设它有一个 <ul> 标签,而这正是您最终需要操作其 .style.transform

CardList >>> List >> ul(这是传递 ref 所需的元素)

要将 listRefCardList 一直传递到 ul ,您需要使用 forwardRef 技术。

Card.List=React.forwardRef(function CardList (props,ref)
{
     const {children,...restProps} = props
     return <List{...restProps} ref={ref} >{children}</List>
})

List 组件本身:

const List = React.forwardRef(function (props,ref) {
           return <ul ref={ref}>
           ... the implementation of your List
             

现在您可以在此处传递 listRef ,它会沿着链条传递:

 <Card.List ref={listRef}> 

旁注 :取自 Drew Reese 对这个答案的评论,因为 CardList 只是将相同的 props 从父组件转移到 List ,您只需将 List 分配给 Card.List ,然后只有一个 ref 转发步骤足够:

Card.List = List // CardList component isn't used anymore.

同样的事情可以适用于 Card.ListTitleCard.Wrapper

Card.ListTitle=ListTitle
Card.Wrapper=Wrapper

Erfan
2021-10-13

我也遇到了同样的问题,并尝试让我的代码重新运行。检查您提供的代码和我的错误代码片段之间的相似性帮助我修复了错误。 奇怪的是,我在我的元素( MUI < Snackbar > 元素,在我的情况下)后面有一个 JSX 多行注释时遇到了此错误。

错误:

Error Thrown Console Log Warning!

我的代码片段如下所示:

      <Snackbar open={snackbarOpen} autoHideDuration={5000} onClose={()=>setSnackbar(false)} > {/* My Comment Here */}

            <>...</> 

      </Snackbar>

JSX 注释的位置与您的卡片组件非常相似

Card.ArrowSliderLeft = function 
    ...
    return <ArrowSliderLeft {...restProps }>
        {/*id allows me to style the icon directly */}
                <ArrowBackIosOutlined ... /> 
           </ArrowSliderLeft>

对于我来说,删除紧跟在开启标签后面的注释部分 就行了。 因此,请尝试删除您的 JSX 注释或将其放在其他地方,看看是否有帮助。

在这里分享仅供我和其他人将来参考。:)

Harshit Gupta
2022-01-03