简体   繁体   English

ReactJS 错误 TypeError:无法将 undefined 或 null 转换为对象

[英]ReactJS error TypeError: Cannot convert undefined or null to object

The affected code is (Typescript errors in local) (componet is correct, the name is as that):受影响的代码是(本地打字稿错误)(组件是正确的,名称就是这样):

{template.elements.map((element: TemplateElementModel, i) => {
            const stand = roomStands?.find(
              (stand: ExhibitorModel) => stand.standNumber === `${i + 1}`
            );
            const componet = stand ? (
              <img
                src={stand?.logo}
                alt={`${stand?.name} logo`}
                className="w-24 object-contain"
              />
            ) : undefined;
            const handleClick = stand
              ? () => {
                  dispatch(setExhibitor(stand?.id));
                  dispatch(pushScreen(EventDetailScreen.stand));
                }
              : undefined;

That's when the code has an error but is just the new registers.那是代码有错误但只是新寄存器的时候。 When all is ok it shows the view but if has that error the view was a blank page.当一切正常时,它会显示视图,但如果出现该错误,则视图是空白页。

I've tried a lot of solutions but i cannot detect what is the problem.我尝试了很多解决方案,但我无法检测出问题所在。

在此处输入图片说明

The complete code is:完整的代码是:

import React, { useEffect, useState } from "react";
import {
  TemplateElementModel,
  TemplateModel,
} from "../../template/template.model";
import {
  currentEventIdSelector,
  roomIdSelector as eventRoomSelector,
  popScreen,
  pushScreen,
  setExhibitor,
  setRoom,
} from "../event.slice";
import { useDispatch, useSelector } from "react-redux";

import { Collections } from "../../../config/app.collections";
import DeimosModal from "../../../lib/deimos-ui/components/deimos-modal/DeimosModal";
import { EventDetailScreen } from "../enums/event-detail-screen";
import { ExhibitorModel } from "../../exhibitor/exhibitor.model";
import { RoomModel } from "../../room/room.model";
import { RootState } from "../../../app.store";
import TemplateMarker from "../../template/components/TemplateMarker";
import { TemplateTypes } from "../../template/template-types.enum";
import { useFirestoreConnect } from "react-redux-firebase";

interface EventExhibitionsPageProps {}

const EventExhibitionsPage: React.FC<EventExhibitionsPageProps> = () => {
  const dispatch = useDispatch();
  const [template, setTemplate] = useState<TemplateModel>();
  const [roomStands, setRoomStands] = useState<ExhibitorModel[]>();
  const [showRoomsModal, setShowRoomsModal] = useState(true);
  const currentRoom = useSelector(eventRoomSelector);
  const eventId = useSelector(currentEventIdSelector);
  const rooms = useSelector(
    (state: RootState) => state.firestore.data[Collections.ROOM]
  );
  const templates = useSelector(
    (state: RootState) => state.firestore.data[Collections.TEMPLATE]
  );
  const stands = useSelector(
    (state: RootState) => state.firestore.data[Collections.EXHIBITOR]
  );

  useFirestoreConnect([
    {
      collection: Collections.ROOM,
      where: ["event", "==", eventId],
    },
    {
      collection: Collections.TEMPLATE,
      where: ["type", "==", TemplateTypes.Room],
    },
    {
      collection: Collections.EXHIBITOR,
      where: ["eventId", "==", eventId],
    },
  ]);

  useEffect(() => {
    if (!currentRoom) return;
    const template = templates[currentRoom?.template];
    if (template) setTemplate(template);
  }, [currentRoom, templates]);

  useEffect(() => {
    if (!currentRoom) return;
    const filteredStands = Object.values<ExhibitorModel>(stands).filter(
      (stand) => stand.room === currentRoom.id
    );
    setRoomStands(filteredStands);
  }, [currentRoom, stands]);

  return (
    <div className="h-full w-full relative bg-no-repeat bg-center text-center">
      <DeimosModal
        isOpen={showRoomsModal}
        hideCancelButton={!currentRoom}
        closeButtonText="Salir"
        cancelButtonText={`Seguir en ${currentRoom?.name}`}
        handleCancel={() => {
          setShowRoomsModal(false);
        }}
        handleClose={() => {
          dispatch(popScreen());
        }}
      >
        {!!rooms && (
          <div>
            <p className="font-bold">Selecciona una sala a la que entrar</p>
            {Object.values<RoomModel>(rooms).map((room) => {
              return (
                <div
                  className="flex flex-row w-full my-2 p-3 bg-gray-200 rounded cursor-pointer"
                  onClick={() => {
                    dispatch(setRoom(room));
                    setShowRoomsModal(false);
                  }}
                >
                  {room.name}
                </div>
              );
            })}
          </div>
        )}
      </DeimosModal>
      {currentRoom && template && (
        <div
          className="w-full h-full flex flex-row justify-center align-center"
          style={{
            backgroundImage: `url(${template.background})`,
            backgroundSize: "100% 100%",
          }}
        >
          {template.elements.map((element: TemplateElementModel, i) => {
            const stand = roomStands?.find(
              (stand: ExhibitorModel) => stand.standNumber === `${i + 1}`
            );
            const componet = stand ? (
              <img
                src={stand?.logo}
                alt={`${stand?.name} logo`}
                className="w-24 object-contain"
              />
            ) : undefined;
            const handleClick = stand
              ? () => {
                  dispatch(setExhibitor(stand?.id));
                  dispatch(pushScreen(EventDetailScreen.stand));
                }
              : undefined;
            return (
              <TemplateMarker
                // backgroundColor="#327ba8"
                width={element.w}
                height={element.h}
                x={element.x}
                y={element.y}
                key={element.id}
                skewX={element.skewX ?? template.skewX}
                skewY={element.skewY ?? template.skewY}
                labelComponent={componet}
                onClick={handleClick}
              />
            );
          })}
        </div>
      )}
    </div>
  );
};

export default EventExhibitionsPage;

TemplateMarker might not accept labelComponent to be undefined or null. TemplateMarker 可能不接受 labelComponent 为 undefined 或 null。 You can add an extra check before sending TemplateMarker.您可以在发送 TemplateMarker 之前添加额外的检查。

   return componet && (
      <TemplateMarker
        // backgroundColor="#327ba8"
        width={element.w}
        height={element.h}
        x={element.x}
        y={element.y}
        key={element.id}
        skewX={element.skewX ?? template.skewX}
        skewY={element.skewY ?? template.skewY}
        labelComponent={componet}
        onClick={handleClick}
      />
    );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 错误TypeError:无法将未定义或null转换为对象 - error TypeError: Cannot convert undefined or null to object 渲染错误:“TypeError:无法在 vue js 中将未定义或 null 转换为对象”? - Error in render: “TypeError: Cannot convert undefined or null to object” in vue js? 数据()中的Vue警告错误“类型错误:无法将未定义或空值转换为对象” - Vue warning Error in data() "TypeError: Cannot convert undefined or null to object" json数据错误未捕获的TypeError:无法将未定义或null转换为对象 - json data error Uncaught TypeError: Cannot convert undefined or null to object 服务器错误:类型错误:无法将未定义或 null 转换为 object - Server Error : TypeError: Cannot convert undefined or null to object 无法将未定义或null转换为对象reactjs - Cannot convert undefined or null to object reactjs 类型错误:无法将未定义或空值转换为对象 javascript - TypeError : Cannot convert undefined or null to object javascript 类型错误:无法将 undefined 或 null 转换为对象 - TypeError: Cannot convert undefined or null to object TypeError:无法在反应中将未定义或 null 转换为 object - TypeError: Cannot convert undefined or null to object in react Javascript:TypeError:无法将未定义或null转换为对象 - Javascript: TypeError: Cannot convert undefined or null to object
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM