0

I am working on a search field where I want to return data to the user, and I get the error: TypeError: Cannot read property 'map' of undefined. I cant seem to find out why the map is undefined,

Here is my code: code sandbox

I tried to take sample code from j-fiddle(code below) and turn it into a functional component. Here is the code I tried to manipulate from 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 Answer 1

2

I was checking your code and found the following error into the Wrapped.js:

<Results {...results} />

Since results is declared as follow:

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

The {...results} will spread the content array into properties in a bad way, I advice you to read about the Spread Operator here.

In order to fix your error, you can do one of the following solutions:

The Easy Solution

<Results results={results} />

The Spread Operator Solution

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

Hope this works for you, please let me know and remember to read about the Spread Operator, it is a really useful function in .JS.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.