【问题标题】:Array being populated with JSX Elements not rendering/updating使用 JSX 元素填充的数组未呈现/更新
【发布时间】:2019-01-10 21:21:21
【问题描述】:

这可能是一个快速的解决方法,但我在过去的一段时间里一直在绞尽脑汁,真的可以用另一双眼睛来看看。

基本上,我正在尝试渲染一个充满生成的 JSX 元素的数组。我觉得我已经做了一百万次了,但它似乎在这里不起作用。

代码如下:

import React, { Fragment } from 'react'
import css from './Search.scss';

import Header from '../SectionHeader/Header';
import SearchItem from '../SearchItem/SearchItem';

const Search = (props) => {

  const { coinObject, coinKeys } = props;

  let searchResults = [];                              // Array in question

  const findResults = (searchText) => {
    searchResults = [];                                // Reset the array to blank for each new character typed in input
    for(let i = 0; i < coinKeys.length; i++) {         
      const { FullName } = coinObject[coinKeys[i]];    // App specific logic, not important, or the problem here
      if(FullName.toLowerCase().includes(searchText) && (searchResults.length < 5)) {    
        console.log(FullName, searchText);             // Prints the correct Full name based off of the searched text
        searchResults.push(<SearchItem key={i} searchText={FullName} />);
      }
    }
    console.log(searchResults);                        // Prints the updated array with all react elements
  }

  return (
    <Fragment>
      <Header title='Find Coins!' />
      <div className={css.searchContainer}>
        <div className={css.inputContainer}>
          <input onChange={input => findResults(input.target.value)} className={css.searchInput} type='text' placeholder='Start Typing a Coin'/>
        </div>
        { searchResults }
      </div>
    </Fragment>
  );
}

export default Search;

还有 SearchItem 组件,超级简单:

import React from 'react'
import css from './SearchItem.scss';

const SearchItem = (props) => {
  return (
    <div className={css.searchItem}>
      {props.searchText}
    </div>
  )
}

export default SearchItem;

对于一点上下文,这个组件只是获取一个巨大的数据对象,并将显示与输入文本匹配的前 5 个实例。我正在尝试制作其中一种搜索过滤器,当您键入时,它会建议与数据匹配的东西。

数组得到更新,我可以看到数组中的 JSX 对象,它们只是不渲染。我有一种感觉是因为数组没有重新渲染?

非常感谢任何帮助。谢谢!

【问题讨论】:

    标签: javascript reactjs dom jsx


    【解决方案1】:

    您可以将Search 组件设为有状态组件,并将searchResults 存储在您的状态中,以便在更新时重新渲染您的组件。

    示例

    class Search extends React.Component {
      state = { searchResults: [] };
    
      findResults = searchText => {
        const { coinObject, coinKeys } = this.props;
        const searchResults = [];
    
        for (let i = 0; i < coinKeys.length; i++) {
          const { FullName } = coinObject[coinKeys[i]];
          if (
            FullName.toLowerCase().includes(searchText) &&
            searchResults.length < 5
          ) {
            searchResults.push(FullName);
          }
        }
    
        this.setState({ searchResults });
      };
    
      render() {
        return (
          <Fragment>
            <Header title="Find Coins!" />
            <div className={css.searchContainer}>
              <div className={css.inputContainer}>
                <input
                  onChange={event => findResults(event.target.value)}
                  className={css.searchInput}
                  type="text"
                  placeholder="Start Typing a Coin"
                />
              </div>
              {this.state.searchResults.map((fullName, i) => (
                <SearchItem key={i} searchText={fullName} />
              ))}
            </div>
          </Fragment>
        );
      }
    }
    

    【讨论】:

    • 感谢您的建议!我将继续使用此方法。另外,您只是将文本添加到数组中,然后在渲染函数中迭代并创建 SearchItem 组件,而不是像以前那样将 JSX 元素作为一个整体放入数组中,有什么原因吗?谢谢!
    • @nicetoCyou 太好了! JSX 只是一堆 React.createElement calls ,“React 方式”是从 render 方法中的 state 和 props 派生你的 React 元素。将元素置于状态可能会导致难以调试的细微错误。
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多