javascript - 使用 Props 和 State 将选择框的值传递给子组件 React.JS

标签 javascript reactjs

背景

我将根据选择框中的值过滤表格。我无法理解 react.js 中的 stateprops。一旦我传递了值,我就可以轻松地进行过滤,但我正在尝试以“ react ”方式来执行此操作。

问题

当用户选择其中一个选项时,如何传递 SelectionBox 的值或将其更改为 TableDisplay

示例

class SelectionBox extends React.Component {
                render() {
                return <div className="filter">
              <label for="business">Filter by Status
                                <select id="business" name="business">
                                    <option value="all">All Requests</option>
                                    <option value="approved">Approved</option>
                                    <option value="pending">Pending</option>
                                    <option value="denied">Denied</option>
                                </select>
                </label>
            </div>;
        }
}

class TableDisplay extends React.Component {
        render() {
            return <div className="wrapper">
            <h1>Requests</h1>
            <SelectionBox /> 
            <div><table className="table">
                    <tr className="seperate"><td>Title</td><td>Status</td><td>Created</td><td>Updated</td><td>Delete</td></tr>
                  {Object.keys(requests).map(function(key) {  
    let styling = "bg-plain";

    if (requests[key].status == "Approved") {
        styling = "bg-success";
    } else if (requests[key].status == "Denied") {
        styling = "bg-danger";
    }

    return <tr className={styling}>
        <td>{requests[key].title}</td>
        <td>{requests[key].status}</td>
        <td>{requests[key].created_at.slice(0, 10)}</td>
        <td>{requests[key].updated_at.slice(0, 10)}</td>
        <td><a href="">Delete</a></td>
    </tr>;

    })}
                    </table>
          </div></div>;
      }
}

研究

从阅读中我认为我需要在这里实现的是, 在 SelectionBox

 constructor(props) {
    super(props);

    this.state = {
// Something referring to the state of the select box here
    };
  };

然后从 TableDisplay 中访问 props

最佳答案

首先,为了澄清您对 stateprops 的理解,您应该引用这个答案:What is the difference between state and props in React?

其次,要将 SelectionBox 的值传递给 TableDisplay,您需要创建某种包含这两个组件的父 TableDisplayContainer 组件。 TableDisplayContainer 将在其状态中存储 select 下拉列表的值。为此,您需要将一个函数作为 prop 传递给 SelectionBox,该函数将处理 select 下拉列表的 onChange 事件(您可以例如,将其称为handleOnChange)。 handleOnChange 方法会将值设置为 TableDisplayContainer 的状态。一旦设置了状态,您就可以将该值作为 prop 传递给 TableDisplay 组件。

以下是您可以执行的操作的简单示例:

class SelectionBox extends React.Component {
  render() {
    return (
      <div className="filter">
        <label for="business">Filter by Status
          <select
            id="business"
            name="business"
            onChange={this.props.handleOnChange}
          >
              <option value="all">All Requests</option>
              <option value="approved">Approved</option>
              <option value="pending">Pending</option>
              <option value="denied">Denied</option>
          </select>
        </label>
      </div>
    );
  }
}

class TableDisplay extends React.Component {
  render() {
    // Do your filtering with this value
    const {selectValue} = this.props;

    return (
      <div className="wrapper">
        <h1>Requests</h1>
        <SelectionBox /> 
        <div><table className="table">
              <tr className="seperate"><td>Title</td><td>Status</td><td>Created</td><td>Updated</td><td>Delete</td></tr>
            {Object.keys(requests).map(function(key) {  
        let styling = "bg-plain";

        if (requests[key].status == "Approved") {
        styling = "bg-success";
        } else if (requests[key].status == "Denied") {
        styling = "bg-danger";
        }

        return <tr className={styling}>
        <td>{requests[key].title}</td>
        <td>{requests[key].status}</td>
        <td>{requests[key].created_at.slice(0, 10)}</td>
        <td>{requests[key].updated_at.slice(0, 10)}</td>
        <td><a href="">Delete</a></td>
        </tr>;

        })}
              </table>
        </div>
      </div>
    );
  }
}
class TableDisplayContainer extends React.Component {
  constructor() {
    super();
    this.state = {
      selectValue: 'all' // use this as default
    }
  }

  handleOnChange(e) {
    this.setState({
      selectValue: e.target.value
    });
  }

  render() {
    const {selectValue} = this.state;

    return (
      <div>
        <SelectionBox
          handleOnChange={this.handleOnChange.bind(this)}
        />
        <TableDisplay
          selectValue={selectValue}
        />
      </div>
    )
  }
}

关于javascript - 使用 Props 和 State 将选择框的值传递给子组件 React.JS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41662073/

相关文章:

javascript - switch语句JS中是否需要使用default

javascript - 从 Tab 键顺序中删除 HTML 标签

javascript - 如何检查ajax缓存?

javascript - AngularJS Accordion is-open 检查与 ng 重复

带有对象数组的 JavaScript;对象中的属性有值,返回未定义

javascript - React 解析具有多个单词标识符的 JSON 数据

javascript - 防止将重复的商品添加到购物篮中

javascript - 在 React 中使用方法装饰器时绑定(bind) this

javascript - react native View 渲染

reactjs - 使用 Jest 测试 Redux thunk 中的调度操作