如何将json数据对象{items.symbol}值传递给另一个类。

问题描述 投票:0回答:1

我使用的是React js。我有一个类Stock.js,我正在获取一个api,并在网页上以表格的形式显示数据,当我点击表格数据(表格数据是链接)时,它将发送 item.symbolonhandleclick() 方法。比如说。

    |Symbol|Age|
     |X  | 20|
     |Y  |22 |

所以在符号表中的值被称为 item.symbol在这里,如果我点击 X 它发送的值 Xonhandleclick() 现在我想把这个值 XY 无论哪个用户点击到另一个类。我所说的另一个类是指比如说我有一个类 xyz.js 我想发送的值 item.symbol 归类 xyz.js 所以我可以使用这个值,并在我的 xyz.js 类。有什么方法可以做到吗?

我的代码。(Stock. js)

import React, { Component } from "react";
import { Link } from "react-router-dom";
import Symbols from "./Symbols";

export default class Stocks extends Component {


  constructor(props) {
    super(props);
    this.state = {
      items: [],
      isLoaded: false,
     symbolsname: "",
    };
  }


  handleClick(symbol) {
      //pass the value to another class here
  }

  componentDidMount(symbol) {
    fetch("http://131.181.190.87:3001/all")
      .then((res) => res.json())
      .then((json) => {
        this.setState({
          isLoaded: true,
          items: json,

        });
      });
  }

  render() {

    let filteredItems = this.state.items.filter((item) => {
      return (
        item.symbol.toUpperCase().indexOf(this.state.search.toUpperCase()) !==
          -1 || item.industry.indexOf(this.state.search) !== -1
      );
    });
    var { isLoaded, items } = this.state;
    if (!isLoaded) {
      return <div>Loading...</div>;
    } else {
      return (
        <div>

          <table border={2} cellPadding={1}>
            <thead>
              <tr>
                <th>Symbol</th>
                <th>Name</th>
                <th>Industry</th>
              </tr>
            </thead>

            <tbody>
              {filteredItems.map((item) => (
                <tr>
                  <Link to="/symbols">
                    <td
                      key={item.symbol}
                      onClick={() => this.onhandleclick(item.symbol)} //here I am passing the value of item.symbol to onhandleclick()
                    >
                      {item.symbol}
                    </td>
                  </Link>

                  <td key={item.name}>{item.name}</td>
                  <td key={item.industry}>{item.industry}</td>
                </tr>
              ))}
              }
            </tbody>
          </table>
        </div>
      );
    }
  }
}

在做了什么之后 maniraj-murugan在答案中说,它说未定义,所以我已经上传了截图。

enter image description here

enter image description here

json reactjs api fetch fetch-api
1个回答
1
投票

你可以重定向到 symbol.js 使用 history.push 的点击事件处理程序,如,(删除 Link 标签在此)所以改。

    <Link to="/symbols">
      <td key={item.symbol} onClick={() => this.onhandleclick(item.symbol)} //here I am passing the value of item.symbol to onhandleclick()>
            {item.symbol}
      </td>
   </Link>

到:

<td key={0} onClick={() => this.onhandleclick(item.symbol)} 
style={{ cursor: "pointer", color: "blue" }}
 >
   {item.symbol}
</td>

还有 onHandleClick 职能如:

onhandleclick(data) {
    const { history } = this.props;
    history.push({
      pathname: "/Symbol",
      symbol: data
    });
  }

在这里,第二个属性是你可以通过的道具,在你的情况下是符号,所以你可以给它像。symbol: data ..

工作沙盒: https:/codesandbox.iosreact-router-v4-withrouter-demo-2luvr。

更新。-> 在OP的更新后,有一些变化。

=> import { BrowserRouter } from "react-router-dom";在主组件中。index.js 其中你是在调用ReactDOM.render时初始化父组件的。

index.js.index.js:在调用ReactDOM.render时初始化父组件。

import React from "react";
import ReactDOM from "react-dom";

import App from "./App";
import { BrowserRouter } from "react-router-dom";

const rootElement = document.getElementById("root");
ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  rootElement
);

stocks. js:

import React, { Component } from "react";
import { Link } from "react-router-dom";
import Symbols from "./Symbols";

const filteredItems = [
  { symbol: "X", name: "item1", industry: "industry1" },
  { symbol: "Y", name: "item2", industry: "industry2" }
];

export default class Stocks extends Component {
  constructor(props) {
    super(props);
    this.state = {
      items: [],
      isLoaded: false,
      search: "",
      symbol: ""
    };
  }

  updateSearch(event) {
    this.setState({ search: event.target.value });
  }

  onhandleclick(data) {
    const { history } = this.props;
    history.push({
      pathname: "/Symbols",
      symbol: data
    });
  }

  componentDidMount() {}

  render() {
    return (
      <div>
        <form className="form-for-table-search">
          Search symbol or industry: &emsp;
          <input
            type="text"
            value={this.state.search}
            onChange={this.updateSearch.bind(this)}
          />
          &emsp; &emsp;{" "}
          <button type="button" className="btn-submit">
            Search
          </button>
          <br />
        </form>
        <table border={2} cellPadding={1}>
          <thead>
            <tr>
              <th>Symbol</th>
              <th>Name</th>
              <th>Industry</th>
            </tr>
          </thead>

          <tbody>
            {filteredItems.map((item, index) => (
              <tr key={index}>
                <td
                  key={0}
                  onClick={() => this.onhandleclick(item.symbol)} //here I am passing the value of item.symbol to onhandleclick()
                  style={{ cursor: "pointer", color: "blue" }}
                >
                  {item.symbol}
                </td>

                <td key={item.name}>{item.name}</td>
                <td key={item.industry}>{item.industry}</td>
              </tr>
            ))}
          </tbody>
        </table>
      </div>
    );
  }
}

Symbols.js:

import React from "react";

export default class Symbol extends React.Component {
  componentDidMount() {
    console.log("came here", this.props.location.symbol);
  }

  render() {
    return <div>Symbol value: {this.props.location.symbol}</div>;
  }
}

更新的沙盒


0
投票

你可以将一个函数从 Symbol.js 并用于 handleClick.

// Symbol.js
export default class Symbol {
  doSomething(symbol) {
    // do something
  }
}
// Stocks.js
import Symbol from 'Symbol.js';

handleClick(symbol) {
  Symbol.doSomething(symbol);
};
© www.soinside.com 2019 - 2024. All rights reserved.