为啥从子组件返回时我会从查询结果中获得空指针?

Posted

技术标签:

【中文标题】为啥从子组件返回时我会从查询结果中获得空指针?【英文标题】:Why i'll get null pointer from Query results when come back from child component?为什么从子组件返回时我会从查询结果中获得空指针? 【发布时间】:2020-03-24 20:22:29 【问题描述】:

您好,我的 react 应用有问题。我有一个包含主题列表的页面,这些主题是我通过 react-apollo 查询获得的数据。此页面具有将我链接到另一个组件的操作。

然后在那个子组件中,我有 Button Back,当我单击它时,它会将我返回到该视图列表...但是这次它抛出了空指针错误,我不知道为什么会发生这种情况。

const getSubject = `query GetSubject($id: ID!) 
  getSubject(id: $id) 
    id
    name
    description
    packages(limit:999) 
      items 
        id
        name
        description
        order
        themes(limit:999)
          items 
            id
            name
            order
          
        
      
    
  

`;
function SubjectView(props) 
  const classes = useStyles();
  let width = window.innerWidth;
  let years = [];
  const [rocnikValue, setRocnik] = useState(0);
  const [mobile, setMobile] = useState(0);


  useEffect(() => 
    function changeSize() 
      if ((window.innerWidth < 960) && (mobile === false)) 
        setMobile(true);
      
      else if  ((window.innerWidth > 960) && (mobile === true)) 
        setMobile(false);
      
      else return;
    
    window.addEventListener("resize", changeSize.bind(this));
    return function cleanup() 
      window.removeEventListener("resize", changeSize.bind(this));
    ;
  );

  const handleSelect = event => 
    setRocnik(event.target.value);
  ;

  return (
    <>
      <Query
        query=gql(getSubject)
        variables= id: props.match.params.subjectId 
      >
        result => 
          if (result.loading) 
            return (
              <LinearProgress />
            );
          

          if (result.error) 
            return (
              <Typography color="error" variant="body1">
                result.error
              </Typography>
            );
          
         /* HERE I GET NULL POINTER ERROR */
          result.data.getSubject.packages.items
            .sort((a, b) => a.order - b.order)
            .map((item,i) => years[i] = item.name)
          if (!rocnikValue.length) 
            setRocnik(years[0]);
            return null;
          

          if (width < 960) 
            if (!mobile.length) setMobile(true);
            return (
              <div className=classes.page>
                <SubjectHeader 
                  subject = result.data.getSubject
                  years = years
                  handleSelect = handleSelect
                  rocnik = rocnikValue
                />
                result.data.getSubject.packages.items
                  .sort((a, b) => a.order - b.order)
                  .map((pkg, pkgIndex) => (
                    <Fragment key=pkgIndex>
                      pkg.name === rocnikValue &&
                        <MobileView
                          key = pkgIndex
                          rocnik = pkg
                        />
                      
                    </Fragment>
                ))
              </div>
            );
          
          else 
            if (!mobile.length) setMobile(false);
            return (
              <div className=classes.page>
                <SubjectHeader 
                  subject = result.data.getSubject
                  years = years
                  handleSelect = handleSelect
                  rocnik = rocnikValue
                />
                <DesktopView 
                  subject = result.data.getSubject
                  rocnik = rocnikValue
                />
              </div>
            );
          
        
      </Query>
    </>
  );

我认为带有后退按钮的子组件并不重要。

为什么会这样?

【问题讨论】:

在 SubjectView 中是对我收到空指针错误的那个地方的评论。 【参考方案1】:

您已检查变量加载和错误。我也会在使用之前检查数据。像这样的:

if (result.data && result.data.hasOwnProperties('getSubject') && result.data.getSubject) 
...insert your actions here
 else 
  return null <== If it's Ok...

【讨论】:

以上是关于为啥从子组件返回时我会从查询结果中获得空指针?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 eloquent orm 上的查询语句结果返回空值

C语言指针初学者 请帮我看看下面的提 为啥调用函数返回值是char型的 这样不就只能返回一个字符了吗

从子查询存储过程分配变量

有关C语言指针的问题:为啥最后结果是空指针?

为啥会出错啊!???????

Android:为啥 DialogFragment 在方向更改时返回空指针