从一个组件访问另一个组件的数据

5

你好,我开始学习ReactJS。在了解基础知识后,我开始使用ReactJS进行数据库连接。在代码中,我试图获取userId和Password以建立DB连接,并尝试列出DB中可用的表。在Login.js中,我创建了一个表单(userId和Password),当点击登录按钮时,我将建立连接并执行“Show Table”查询以列出DB中的所有表格,并转到“Table.js”页面,在那里我尝试列出可用表格。目前,我能够连接到DB,但无法在“Table.js”中显示表格,请问如何在Table.js文件中显示表格列表,因为我已经将我的DB连接和查询放置在Login.js中的按钮事件中。另外,是否可以声明一个全局变量并跨其他js文件进行访问?感谢您的帮助。

Login.js

import React from 'react';
import TableContent from './tables';
class Login extends React.Component{
    constructor(){
        super();
        this.state={
            showComponent : false,
        };
        // this.buttonClick = this.buttonClick.bind(this);
    }

    buttonClick(event){
        event.preventDefault();
        this.setState({
            showComponent: true,
        })

        var db = require('@dataBase/dynamoConnect')({
            "UserId": "XXXXXXXXXXXXXXXXXXXXXXXX",
            "Password": "YYYYYYYYYYYYYYY",
            "region": "ZZZZZZZZZZ"
        });
        db.query("SHOW TABLES",(err,data)=>{
        const tableList = data;
        console.log(tableList);
        })
    }
    render(){
        return(
            <div>
                <form>
                    <label>User Id :</label>
                    <input type="text" className="test"/>
                    <br/>
                    <label>Password :</label>
                    <input type="text" className="test" />
                    <button onClick={this.buttonClick.bind(this)} className="connect" > Login</button>
                  </form>
                 {this.state.showComponent && <TableContent />}
            </div>  
        )
    }
}

export default Login;

Table.js

import React from 'react';

class TableContent extends React.Component {
    constructor() {
        super();
        this.state = {
            showComponent: false,
        };
        this.buttonClick = this.buttonClick.bind(this);
    }

    buttonClick(event) {
        event.preventDefault();
        this.setState({
            showComponent: true,
        })
    }

    render() {
        return (
            <div>
                <form>
                 <div id="first">   
                <label> Table </label>
                <br />
                //Display the tables from DB here
                <select name="sometext" multiple="multiple" >
                    <option>Table1</option>
                    <option>Table2</option>
                    <option>Table3</option>
                    <option>Table4</option>
                    <option>Table5</option>
                </select>
                </div>
                <div id="second"> 
                <label> SQL </label>
                <br/>
                <textarea rows="4" cols="50">SQL </textarea>
                </div>
                <button onClick={this.buttonClick.bind(this)} > Execute </button> 
                <div id="third" >
                {this.state.showComponent && <SampleTable />}
                </div>
                </form>
            </div>
        )
    }
}

export default TableContent;
2个回答

1

许多策略可用于组件间通信,但最简单的方法(不使用Flux或Redux)是使用父组件作为通信的中介。

基本上,父组件向一个组件传递回调函数,该函数设置一些状态以传递给另一个组件,例如:

子组件创建数据

class Child1 extends React.Component {
  constructor() {
    super()
    this.handleClick = this.handleClick.bind(this)
  }

  handleClick() {
    this.props.setMessage("hello world")
  }

  render() {
    return <button onClick={this.handleClick}>say hello</button>
  }
}

孩子使用数据
const Child2 = ({message}) => {
  return <p>{message}</p>
}

父级标签

class Parent extends React.Component {
  constructor() {
    super()
    this.state = { message: "" }
  }

  render() {
    return (
      <div>
        <Child1 setMessage={(message) => this.setState({ message })} />
        <Child2 message={this.state.message} />
      </div>
    )
  }
}

如果它们不能成为兄弟组件,这种模式可能会变得有点费力,但仍然可以通过将中介组件作为最低公共祖先并将相关属性一路传递来实现。但此时,您可能需要调查Flux或Redux,并完全从组件中外部化状态。

1

第一步。

Table.js组件需要知道要显示的数据。
1 - 你需要在查询回调函数中调用this.setState({tableData: tableList})将查询结果保存到组件状态中:

db.query("SHOW TABLES",(err,data)=>{
  const tableList = data;
  this.setState({
    tableData: tableList,
  });
})  

2 - 你需要将保存的结果作为属性传递给TableContent,像这样:

Login.js中:
{this.state.showComponent && <TableContent data={this.state.tableData} />}

3 - 在子组件中呈现数据。您可以通过this.props.data访问它。您可以遍历结果数组并在单个循环中呈现所有表行。请参阅this react doc

其次:

此外,是否可能声明一个变量为全局变量并跨另一个js文件进行访问?

简而言之-是的。您可以从模块中导出函数、变量、类。

小例子:

// scriptA.js;
export const a = 42;

// scriptB.js;
import { a } from 'path/to/scriptA.js';
console.log(a) // will print 42;

这个例子假定你正在使用es6的导入/导出功能。你也可以使用require


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接