Отображение данных из json в виде предложений под панелью поиска в reactjs

У меня есть компонент AutoFill, который выглядит так:

const AutoFill = (props) => {
  console.info('proppppppsss', props)
  const results = props.results || []

  return (
    <ul>
      {results.map(({ name, href }) => (
        <li key = {href}>
          <a href = {href} target='_blank' rel='noopener noreferrer' key = {href}>
            {name}
          </a>
        </li>
      ))}
    </ul>
  )
}


The Json File where data gets passed through looks like this,
[
  {
    "a": {
      "apple": {
        "name": "apple",
        "href": "https://www.apple.com/"
      },
      "armadillo": {
        "name": "armadillo",
        "href": "https://www.armadillo.com/"
      }
    },
    "b": {
      "box": {
        "name": "box",
        "href": "https://www.box.com/"
      },
      "berserk": {
        "name": "berserk",
        "href": "https://www.berserk.com/"
      }
    }
  }
]


The fetch that gets the data from the json
import fetch from 'isomorphic-fetch'

const FetchAndParseResults = (url) => {
  return fetch(url).then(response => {
    const parsedJson = response.json()
    return parsedJson
  })
}

export default FetchAndParseResults


The search that makes use of the autofill
import AutoFill from './autofill'
import PropTypes from 'prop-types'

export default class Searchbar extends React.Component {
  constructor (props) {
    super(props)
    this.state = {
      className: Styles.input,
      icon: Styles.icon__wrapper,
      value: []
    }
    this.input = React.createRef()
  }

  openInput = () => {
    this.setState({
      className: Styles.input__active,
      icon: Styles.iconWidth
    }, () => {
      this.input.focus()
    })
    this.props.onOpen && this.props.onOpen()
  }

  closeInput = () => {
    this.setState({
      className: Styles.input,
      icon: Styles.icon__wrapper
    })
    this.props.onClose && this.props.onClose()
  }

  handleChangeEvent = event => {
    let value = event.target.value
    this.setState({ value })
    this.props.performSearch(value)
  }

  handleSubmit = event => {
    event.preventDefault()
  }

  render () {
    console.info('results', this.props.results)
    console.info('state.value', this.state.value)
    return (
      <div>
        <form onSubmit = {this.handleSubmit} className = {Styles.search}>
          <div className = {this.state.icon}>
            <Icon className = {Styles.icon__wrapper} iconName='faSearch' onClick = {this.openInput} />
          </div>
          <Search autoComplete='off' value = {this.state.value} onChange = {this.handleChangeEvent} id='search' tabIndex='0' myref = {input => { this.input = input }} className = {this.state.className} onBlur = {this.closeInput} placeholder='Search' />
        </form>
        <div>
          <AutoFill results = {this.props.results} />
        </div>
      </div>
    )
  }
}

Search.propTypes = {
  performSearch: PropTypes.func,
  results: PropTypes.array
}


the searchContainer that makes use of everything
import React from 'react'
import Searchbar from './index.js'
import FetchAndParseResults from './FetchAndParseResults.js'

class SearchContainer extends React.Component {
    state = {
      results: []
    }

    performSearch = event => {
      return FetchAndParseResults('static/autofill.json').then(data => {
        this.setState({ results: data })
      })
    }

    render () {
      return (
        <Searchbar
          performSearch = {this.performSearch}
          results = {this.state.results}
        />
      )
    }
}

export default SearchContainer


At <a href = {href} target='_blank' rel='noopener noreferrer' key = {href}>{name}</a> the data of the names should be displayed but instead of the names i get this, https://gyazo.com/647176b09afcd55b4238f7975c0e7488

Пустой неупорядоченный список.

Поэтому помощь будет очень признательна, и заглянул.

Ошибка заключается в том, что вы передаете данные в функцию AutoFill. Не могли бы вы показать код для этого?

Colin Ricardo 27.11.2018 12:31

@Colin Я включил только те файлы, которые, как я думал, не отображали данные, но я их включил.

Drarula 27.11.2018 13:09

Если вы войдете в систему performSearch, что вы получите?

Colin Ricardo 27.11.2018 13:41

@Colin это то, что я получаю, gyazo.com/c12a041ff60ae0b31f60b9bbb5c040e2 Первый console.info - это событие performSearch, а второй - внутренняя часть performSearch

Drarula 27.11.2018 13:51

Есть ли причина, по которой вы загружаете свой JSON таким образом, а не просто import SearchResults from 'static/autofill.json'?

AnonymousSB 27.11.2018 14:04

@AnonymousSB Поскольку такой импорт не работает, я сначала пробовал это, но каким-то образом он хочет получить его как URL-адрес. Так что мне пришлось сделать это так.

Drarula 27.11.2018 14:09
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
6
222
0

Другие вопросы по теме