【问题标题】:Why isn't the map function iterating over the array?为什么 map 函数不遍历数组?
【发布时间】:2020-07-13 19:27:50
【问题描述】:

我正在使用 React,我是新手,它说要使用 map 方法来迭代数组。当我这样做时,整个数组都会记录到控制台,而不是我想要的单个单词。

当用户在文本框中键入股票代码时,我试图调用它们。但是在函数getSymbol() 下,即使我在渲染中使用了map,符号的状态仍然是一个数组。谁能指出我正确的方向?或者我该怎么做才能获得单个元素。

这是我的代码:

class Symbol extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            userInput: '',
            symbol: [],
            isLoaded: false
        }
    }

    typeSymbol = (e) => {
        this.setState({
            userInput: e.target.value.toUpperCase()
        }, () => {
            console.log(this.state.userInput)
        })
    }

    getSymbol = (e) => {
        e.preventDefault(),
            this.setState({
                symbol: this.state.symbol

            }, () => {
                console.log(this.state.symbol)
            })
    }

    componentDidMount() {
        fetch(`https://finnhub.io/api/v1/stock/symbol?exchange=US&token=${key}`)
            .then(res => res.json())
            .then(
                (results) => {
                    this.setState({
                        isLoaded: true,
                        symbol: results
                    });
                    // console.log(this.state.symbol)
                },
                (error) => {
                    this.setState({
                        isLoaded: true,
                        error
                    });
                }
            )
    }


    render() {
        const { symbol, userInput } = this.state
        if (userInput === symbol) {
            return (

                symbol.map((symbol, i) => (<span className="symbol" key={i}>{symbol.displaySymbol}</span>)),
                console.log('same')
            )
        } else {
            return (
                <div className="enterstock">
                    <h1 className="title">Enter Stock Symbol</h1>
                    <form className="inputfields" onSubmit={this.getSymbol}>
                        <input type="text" className="symfields" name="symbolname" onChange={this.typeSymbol}></input>
                        <button type="submit" className="btn">Send</button>
                    </form>
                </div >
            )
        }

    }
}

【问题讨论】:

  • 只是一个建议,但我认为您的类名与名为 Symbol 的内置 JS 功能相冲突。
  • @JohnPavek 感谢您提供的信息!

标签: javascript reactjs


【解决方案1】:

您以两种不同的方式使用symbol,它们正在发生冲突。尝试重命名 map() 函数的参数:

symbol.map((s, i) => (<span className="symbol" key={i}>{s.displaySymbol}</span>)),

symbol 不是 JavaScript 中的保留字,所以你应该很好。

【讨论】:

  • 感谢您的信息,但我仍在获取数组。
  • 你能发布输出和控制台日志吗?
  • 我把图片贴在上面,我正在使用 console.log(this.state.symbol) 来渲染输出
【解决方案2】:

问题在于您的 if 块。地图方法工作正常。发生的事情是您将 userInput(String) 与 symbol(an array) 进行比较,它将不起作用。我不知道你要做什么检查。但是如果是检查 userInput 是否在数组中,你就做错了。

import React from "react";
class Symbol extends React.Component {
constructor(props) {
super(props);
this.state = {
  userInput: "",
  symbol: [],
  isFiltered: false,
  isLoaded: false,
 };
}

typeSymbol = (e) => {
this.setState(
  {
    userInput: e.target.value.toUpperCase(),
  },
  () => {
    console.log(this.state.userInput);
  }
 );
};

getSymbol = (e) => {
e.preventDefault();
const filter = this.state.symbol.filter(
  (el) => el.displaySymbol === this.state.userInput
);
// console.log(filter);
this.setState(
  {
    symbol: filter,
    isFiltered: true,
  },
  () => {
    console.log(this.state.symbol);
   }
 );
};

componentDidMount() {
fetch(`https://finnhub.io/api/v1/stock/symbolexchange=US&token=${key}`)
  .then((res) => res.json())
  .then(
    (results) => {
      this.setState({
        isLoaded: true,
        symbol: results,
      });
      console.log(this.state.symbol);
      },
      (error) => {
      this.setState({
        isLoaded: true,
        error,
      });
     }
   );
  }

 render() {
 const { symbol, userInput } = this.state;
 //console.log(userInput);
 if (this.state.isFiltered) {
  return symbol.map((symbol, i) => {
    return (
      <span className="symbol" key={i}>
        {symbol.displaySymbol}
      </span>
    );
  });
} else {
  return (
    <div className="enterstock">
      <h1 className="title">Enter Stock Symbol</h1>
      <form className="inputfields" onSubmit={this.getSymbol}>
        <input
          type="text"
          className="symfields"
          name="symbolname"
          onChange={this.typeSymbol}
        ></input>
        <button type="submit" className="btn">
          Send
        </button>
      </form>
    </div>
  );
  }
 }
}
export default Symbol;

【讨论】:

  • 嗨,这是我认为我做错了,你给了我代码,但它不工作。我一定是把符号的状态弄错了。
  • @Jonathan Akwetey Okine 感谢您提供的信息。我如何比较两者,因为我认为一旦你从地图中获得一个元素,它就会变成一个字符串。
  • @Alanaj 我只给了你一个建议,但可以确切地告诉我你想对你的 if 条件做什么,所以我提供帮助?
  • @ Jonathan Akwetey Okine 因此,当用户在 userInput 的输入字段中输入时,他们应该按发送,并且相应的符号应该与他们输入的符号匹配. 它应该返回有关该股票代码的信息,但现在我只是返回名称。
  • @Jonathan Akwetey Okine 感谢您的所有帮助,但没有奏效。我仍然无法访问 getSymbol 函数中的数组。它返回一个对象,我认为异步调用可能有问题。
猜你喜欢
  • 2019-12-10
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多