无法通过-> TypeError:无法在生产版本中读取未定义的属性'id'

时间:2020-05-06 21:46:17

标签: javascript reactjs

长话短说,我有一个表,在其中使用以下代码构建了搜索功能,以在对象数组中进行搜索并使用钩子更新状态。

  const SearchView = (e) => {
    e.preventDefault();
    console.log(e.target.value)

    if (!e.target.value) {
      setSearchDataSuggestions([])
      setSearchField(null)

    } else {

      setSearchField(true)
      props.setSeachingView(true)
      for (const row of Object.values(rows)) {
        Object.keys(row).forEach(function (item, index) {

          if (typeof(row[item]) === 'string' && row[item].toLowerCase().includes(e.target.value.toLowerCase().trim())) {
            setSearchDataSuggestions([...search_data_suggestions, (rows[index])   ])

          }

        });
        }

    }

  }

该代码在npm start中工作正常,但在生产版本中无法正常工作……每当我尝试在文本字段中键入内容时(其中SearchView()称为onChange),它就会在空白页上崩溃出现以下控制台错误:

Console Error

我不知道这个错误告诉我什么地方...因为在我的代码中没有传递任何.id。无论如何,我还是会在这里发布整个代码。

有人可以帮助我确定错误触发在哪里,以及为什么它在开发服务器中而不是在prod中可以正常工作吗???!

完整代码如下:

import React, { useState, useEffect } from 'react';
import DataTable from 'react-data-table-component';
import moment from 'moment'
import TextField from '@material-ui/core/TextField';
import InputAdornment from '@material-ui/core/InputAdornment';


const LookUpTable = (props) => {
  const [error, setError] = useState(null);
  const [isLoaded, setIsLoaded] = useState(false);
  const [rows, setItems] = useState([]);
  const [search_data_suggestions, setSearchDataSuggestions] = useState([]);

  const [accessToken] = useState(props.accessToken)
  const [isSearching] = useState(props.isSearching);
  const [search_field, setSearchField] = useState(null);


  const success_validation = row_success => {
    if (row_success) {
      return "True";
    } else {
        return "False";
    }
  };


  const columns = [
    {
      name: 'Timestamp',
      selector: 'timestamp',
      sortable: true,
      format: row => moment(row.timestamp).format('lll'),
    },
    {
      name: 'Project ID',
      selector: 'project_id',
      sortable: true,
    },
    {
      name: 'Client Name',
      selector: 'client_name',
      sortable: true,
      right: true,
    },
    {
      name: 'Client Email',
      selector: 'client_email',
      sortable: true,
      right: true,
    },
    {
      name: 'Client Mobile',
      selector: 'client_mobile',
      sortable: true,

    },
    {
      name: 'Sent By',
      selector: 'sent_by',
      sortable: true,

    },
    {
      name: 'Success',
      selector: 'success_validation',
      sortable: true,
      right: true,
      format: row => success_validation(row.success),
    },
    ];

    const ExpanableComponent = ({ data }) => {
      return(
        <div>
          <p></p>
        <ul>
          <li><strong>Report Filename: </strong>{data.file_name} </li>
          <li><strong>Project Description: </strong>{data.project_desc} </li>
          <li><strong>Project Owner's Name: </strong>{data.project_owner_name} </li>
          <li><strong>Project Owner's Email: </strong>{data.project_owner_email} </li>
        </ul>  
        </div>
      )
    }


  const SearchView = (e) => {
    e.preventDefault();
    console.log(e.target.value)
    // setSearchValue(e.target.value.toLowerCase())
    // const values = (Object.values(rows));

    if (!e.target.value) {
      setSearchDataSuggestions([])
      setSearchField(null)


    } else {

      setSearchField(true)
      props.setSeachingView(true)
      for (const row of Object.values(rows)) {
        Object.keys(row).forEach(function (item, index) {
          // console.log('[' + index + '] ' + 'keys: ' + item + ' values : ' + row[item]);


          if (typeof(row[item]) === 'string' && row[item].toLowerCase().includes(e.target.value.toLowerCase().trim())) {
            setSearchDataSuggestions([...search_data_suggestions, (rows[index])])
            // console.log('Got search as: ' + e.target.value + ' and updated with the row: ' + (rows[index]) )

          }

        });
        }

    }

  }

  const CustonSearchViewRender = () => {
    if (search_field) {
      return (
        <DataTable
        columns={columns}
        data={search_data_suggestions}
        highlightOnHover={true}
        pagination={true}
        fixedHeader={true}
        expandableRows={true}
        expandableRowsComponent={<ExpanableComponent />}
        striped={true}
      />
      )    

    }
  }


  // Note: the empty deps array [] means
  // this useEffect will run once
  // similar to componentDidMount()
  useEffect(() => {
    fetch("/lookup/", {
      method: 'GET',
      headers: {
        'Authorization': `Bearer ${accessToken}`,
      }
    }
    )

      .then(res => res.json())
      .then(
        (result) => {
          setIsLoaded(true);
          setItems(result);
        },
        // Note: it's important to handle errors here
        // instead of a catch() block so that we don't swallow
        // exceptions from actual bugs in components.
        (error) => {
          setIsLoaded(true);
          setError(error);
        }
      )
  }, [accessToken])

  if (error) {
    return <div>Error: {error.message}</div>;
  } else if (!isLoaded) {
    return <div>Loading...</div>;
  } else {
      return (
        <div className='lookup-table container-fluid'> 
        <div className="search-bar container"> 
        <br></br>
        <h4 className="search-bar-title">Past 90 days report table lookup ...</h4> 


      <TextField 
      label="Search me"
      onChange={e => SearchView(e)}
      variant="outlined"
      InputProps={{
        startAdornment: (
          <InputAdornment position="start">
            <i className="fas fa-search"></i>
          </InputAdornment>
        )
      }}
      />
      </div> 


      {isSearching && !search_field?       
      <DataTable
        columns={columns}
        data={rows}
        highlightOnHover={true}
        pagination={true}
        fixedHeader={true}
        expandableRows={true}
        expandableRowsComponent={<ExpanableComponent />}
        striped={true}
      /> : null}

    {search_field ? <CustonSearchViewRender/> : null}


        </div>
      );
  }
}


export default LookUpTable;

非常感谢您。

0 个答案:

没有答案