开发者问题收集

TypeError:无法读取未定义的属性“map”-React

2021-06-26
411

我正在处理一个搜索字段,我想将数据返回给用户,但出现了错误:TypeError:无法读取未定义的属性“map”。我似乎无法找出为什么 map 未定义,

这是我的代码: 代码沙盒

我尝试从 j-fiddle(下面的代码)中获取示例代码并将其转换为功能组件。这是我尝试从 j-fiddle 中操作的代码

class Wrapped extends React.Component {
    constructor(props){
    super(props)
    this.state = {
        results: []
    }
    
    this.search = this.search.bind(this)
  }
  search(results){
    this.setState({results})
  }
    render(){
    const { results } = this.state
    return (
        <div>
          <Search onSearch={this.search} />
        <Result {...this.state} />
        </div>
    )
  }
}

class Search extends React.Component {
    constructor(props){
    super(props);
    this.state = {
        searchValue: ''
    }
    this.handleOnChange = this.handleOnChange.bind(this);
  }
  
  handleOnChange(e){
    this.setState({
        [e.target.name]: e.target.value
    }, () => {
        setTimeout(() => {
        // it can be the result from your API i just harcoded it
        const results = ['hello', 'world', 'from', 'SO'].filter(value => value === this.state.searchValue)
        this.props.onSearch(results)
      }, 1000)
    })  
  }
  
    render(){
    return (
        <div>
          Search: <input name="searchValue" type="text" onChange={this.handleOnChange} />
        </div>
    )
  }
}

const Result = ({results}) => {
    return (
  <ul>
    {results.map(result => <li key={result}>{result}</li>)}
  </ul>
  )
}

ReactDOM.render(
  <Wrapped/>,
  document.getElementById('container')
);
1个回答

我检查了您的代码,发现 Wrapped.js 中存在以下错误:

<Results {...results} />

由于 results 声明如下:

const [results, setResults] = useState([]);

{...results 会以错误的方式将内容数组分散到属性中,我建议您阅读 此处 中有关 Spread 运算符 的信息。

为了修复您的错误,您可以执行以下解决方案之一:

简单解决方案

<Results results={results} />

Spread 运算符解决方案

...
const resultsProps = {
    results,
  }
...
  return (
    <>
      <SearchComp onSearch={search} />
      <Results {...resultsProps} />
    </>
  );
...

希望这对您有用,请告诉我,并记得阅读有关 Spread Operator 的信息,它是 .JS 中一个非常有用的函数。

rigojr
2021-06-26