簡體   English   中英

TypeError:無法讀取未定義的屬性(讀取“toString”)

[英]TypeError: Cannot read properties of undefined (reading 'toString')

我正在嘗試在反應模態中執行 onClick 事件。 當我觸發 onClick 事件時,我希望它發出一個組件表單。 onClick 事件似乎有效,但是當它呈現組件時,它會引發以下錯誤。

TypeError:無法讀取未定義的屬性(讀取“toString”)

這似乎來自組件表單中的以下行

const page = parseInt(router.query.page.toString());

我已將代碼放在下面以供檢查

模態:

import React, {useState} from 'react';
import { observer } from 'mobx-react-lite'
import { useDataStore } from 'stores/data';
import Space from './Space';
import { Plus } from 'components/Icons'
import ShowNetworkInfo from '../../components/Forms/ShowNetworkInfo';
import SpaceDirectory, { Header, Title, Options, Option, OptionIcon, OptionLabel } from "styles/SpaceDirectory/SpaceDirectory";
  
const SPACE_DIRECTORY  = observer((props) => {

const [isInfoShown, setInfoShown] = useState(false);
  
const handleClick = (event) => {
    event.preventDefault(); 
    setInfoShown(true);
    }


  const { spaceStore } = useDataStore();

  const spaces = spaceStore.spaces?.map(space => (
    <Space
      key={space.id} 
      space={space}
    />
  ))

  

  return (
    <SpaceDirectory>
      <Header>
        <Title>SPACES</Title>
        <Options>
          <Option onClick={async () => console.log("ADD SPACE") }>
            <OptionIcon>
              <Plus />
            </OptionIcon>
            <OptionLabel>
              SPACE
            </OptionLabel>
          </Option>
        </Options>
        <Options>
            <Option type='submit' onClick={handleClick} >
          {isInfoShown && <ShowNetworkInfo/>}
            <OptionIcon>
              <Plus />
            </OptionIcon>
            <OptionLabel>
              ADD NETWORK
            </OptionLabel>
          </Option>
        </Options>
      </Header>
      { spaces }
    </SpaceDirectory>
  );
});

export default SPACE_DIRECTORY

onClick 事件觸發並將我帶到以下組件:

零件:

import { observer } from 'mobx-react-lite'
import { useRouter } from 'next/router';
import { useEffect, useMemo, useState } from 'react';

import NetworkInformation from 'components/Forms/NetworkInformation';
import ShowNetworkInfo, { Header, FormNav, FormNavItem, FormBody } from 'styles/Forms/ShowNetworkInfo'
import { useDataStore } from 'stores/data';
import { Product } from 'models/Product';

type NetworkNode = any;
type Order = {
  selectedNetwork:Product
  items:Array<NetworkNode>
}

const SHOW_NETWORK_INFO = observer(() => {
  
  const router = useRouter();
  const page = parseInt(router.query.page?.toString())
  const { productStore } = useDataStore()
  const [order, setOrder] = useState<Order>({
    selectedNetwork:null,
    items:[]
  });

  useEffect(() => {
    const page = parseInt(router.query.page.toString());
    if ( order.selectedNetwork && page === 1 )
      router.push({ pathname:router.pathname, query: { ...router.query, page:2 }})

    if ( !order.selectedNetwork && page > 1 )
      router.push({ pathname:router.pathname, query: { ...router.query, page:1 }})

  },[ order.selectedNetwork ])

  const FormOptions = useMemo(() => {
    const options = [];
    switch(page){

      case 1:
        options.push(
          <NetworkInformation 
            key={`network-catalog`} 
            selectedNetwork={order.selectedNetwork}
            selectNetwork={( productId ) => {
              const targetProduct = productStore.products.find(product => product.pid === productId )
              productId === order.selectedNetwork?.pid ?
                router.push({ pathname:router.pathname, query: { ...router.query, page:2 }}) :
                setOrder({ ...order, selectedNetwork:targetProduct })
            }}
          />
        )
        break;
    }
    return options;
  }, [page]);

  return (
    <ShowNetworkInfo>
      <Header>Network Information</Header>
      {/* <FormNav>
        <FormNavItem 
          data-active={page === 1}
          onClick={() => {
            if( page !== 1 )
              router.push({ 
                pathname:router.pathname,
                query: { ...router.query, page:1 }
              })
          }}>
          1. SELECT
        </FormNavItem>
        <FormNavItem
          data-active={page === 2}
          onClick={() => {
            if( page !== 2 && !!order.selectedNetwork )
              router.push({ 
                pathname:router.pathname,
                query: { ...router.query, page:2 }
              })
          }}>
          2. CONFIGURE
        </FormNavItem>
        <FormNavItem
          data-active={page === 3}
          onClick={() => {
            if( page !== 3 )
              router.push({ 
                pathname:router.pathname,
                query: { ...router.query, page:3 }
              })
          }}>
          3. DEPLOY
        </FormNavItem>
      </FormNav> */}
      <FormBody>
        { FormOptions }
      </FormBody>
    </ShowNetworkInfo>
  )
});

export default SHOW_NETWORK_INFO

router.query = {} 在 nextjs 的第一次渲染中,

您必須將 router.query.page 添加到 useEffect 的依賴項數組中


useEffect(() => {
    if(!router.query.page) return;

    const page = parseInt(router.query.page.toString());
    if ( order.selectedNetwork && page === 1 )
      router.push({ pathname:router.pathname, query: { ...router.query, page:2 }})

    if ( !order.selectedNetwork && page > 1 )
      router.push({ pathname:router.pathname, query: { ...router.query, page:1 }})

  },[ order.selectedNetwork, router.query.page ])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM