【问题标题】:React Hook : Objects are not valid as a React child errorReact Hook:对象作为 React 子错误无效
【发布时间】:2021-08-20 02:42:49
【问题描述】:

当我调用挂钩回调函数“setSearchResults”来设置状态时,我收到“对象作为 React 子项无效”错误。状态值是一个包含对象的数组,但我不确定为什么会收到此错误以及如何解决它。

function WikiSearch() {
const [searchKeyword, setSearchKeyword] = useState('');
const [searchResults, setSearchResults] = useState([]);

function onSearchChangeHandle(event = "") {
    let term = event.target.value;
    setSearchKeyword(term);
    getSearchResult(term);
}

async function getSearchResult(term) {
    const url = 'https://en.wikipedia.org/w/api.php';
    try {
        const {data} = await axios.get(url, {
            params: {
                action: 'query',
                origin: '*',
                format: 'json',
                list: 'search',
                srsearch: term
            }
            
        });
        
        // search is an array having objects
        setSearchResults(data.query.search);  // => causing error

      } catch (error) {
        console.error(error);
      }
}
 
const listData = searchResults.map((search ) => {
    return (
        <Fragment key={search.pageid}>
            <div>
                <span>
                    {search.title}
                </span>
            </div>
            <div>
                <span>
                    {search.snippet}
                </span>
            </div>
        </Fragment>
    )
});

return (
    <div>
        <div className="ui form">
            <div className="field">
                <label>Search</label>
                <input className="input" type="text" name="search" value={searchKeyword} onChange={(e) => onSearchChangeHandle(e) }/>
            </div>  
        </div>
        {listData}
     </div>
)

}

API 响应:

我想遍历这些搜索结果并在列表中显示数据。大概 search.titlesearch.sn-p

【问题讨论】:

  • 你需要解构你的对象以便在渲染中显示它
  • 你想用这个对象完成什么?转成html还是只显示为文本?

标签: javascript reactjs react-hooks


【解决方案1】:

使用JSON.stringify(*your object*) 将您的数组/对象转换为字符串,因为 JS 对象不能是有效的 React 子元素

...
return (
    <div>
        <div className="ui form">
            <div className="field">
                <label>Search</label>
                <input className="input" type="text" name="search" value={searchKeyword} onChange={(e) => onSearchChangeHandle(e) }/>
            </div>  
           {JSON.stringify(searchResults)}
        </div>
        
     </div>
)
...

【讨论】:

  • 我不想将数据显示为字符串,我将使用 map 函数循环遍历数组结果并在列表中显示数据。
  • @Amanjaura — 那就这样做吧!错误是因为你不是。
  • 我正在这样做,但我删除了代码以检查问题是否与列表的呈现有关,但即使我删除了代码(呈现列表),我也遇到了同样的错误。所以这个问题不是因为我没有使用数据。
猜你喜欢
  • 2021-12-02
  • 2018-11-12
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多