ReactJS 和 AltJS 使用下拉按钮

Posted

技术标签:

【中文标题】ReactJS 和 AltJS 使用下拉按钮【英文标题】:ReactJS and AltJS Using DropDown Button 【发布时间】:2015-10-21 01:25:37 【问题描述】:

我无法弄清楚为什么这不起作用。 我创建了一个下拉按钮,其中填充了我的用户或数组。但是它存在于组件<DropDown/>

我想将下拉列表中选定的用户传递给我的组件。我考虑过使用flux(altjs)与我的组件进行通信。

在我的 UserStore 中有

this.selected = "";
this.bindListeners(
  handleSelected: UserActions.GET_SELECTED;
)

handleSelected(data) 
  this.selected = data;

在 useraction 中,我只是说明操作是

getSelected(data) 
   this.dispatch(data)

我的下拉菜单的反应组件是这样的:

import React from 'react';
import Link,State, Route from 'react-router';
import Router from 'react-router';
import UserActions from 'actions/UserActions';
import UserStore from 'stores/UserStore';
import ReportsStore from 'stores/ReportsStore';
import ReportsActions from 'actions/ReportsActions';
export default class Dropdown extends React.Component 
constructor(props) 
  super(props);
  this.state = ReportsStore.getState();
  this.state = UserStore.getState();
  this.state.link = window.location.href;
  this.state.singleReport = [];
  this.state.listVisible = false;
  this.state.display ="";
    

componentDidMount() 
  let state = this.state.link;
  state = state.split('/');
  state = state[state.length-1];
  ReportsActions.getSoloReport(state);
  ReportsStore.listen(this._onChanges);
    

componentWillUnmount() 
  ReportsStore.unlisten(this._onChanges);
    

_onChanges = () => 
  this.setState(
      singleReport: ReportsStore.getState().singleReport,
      duplicate: ReportsStore.getState().singleReport
    );


select = (item) => 
  this.props.selected = item;
  UserActions.getSelected(item);


show = () => 
  this.setState(listVisible: true);
  document.addEventListener("click", this.hide);


hide = () => 
  this.setState(listVisible: false);
  document.removeEventListener("click", this.hide);




render()
          if(this.props.selected == undefined) 
            this.props.selected.email = "Ui";
            this.props.selected.profile.firstName = "jajaj";
            this.props.selected.profile.lastName = "blahablah";
          
          return <div className="dropdown-container" + (this.state.listVisible ? " show" : "")>
            <div className="dropdown-display" + (this.state.listVisible ? " clicked": "") onClick=this.show>
              <span style= color: 'white' >this.props.selected.email + " : " + this.props.selected.profile.firstName + " " + this.props.selected.profile.lastName</span>
              <i style= color: 'red'  className="fa fa-angle-down"></i>
            </div>
            <div className="dropdown-list">
              <div>
                this.renderListItems()
              </div>
            </div>
          </div>;
        

renderListItems() 
          let items = [];
          for (let i = 0; i < this.props.list.length; i++) 
            let item = this.props.list[i];
            items.push(<div onClick=this.select.bind(null, item)>
              <span style= color: 'black' >item.email + " : " + item.profile.firstName + " " + item.profile.lastName</span>
              <i style= color: 'black'  className="fa fa-check"></i>
            </div>);
          
          return items;
        

最后在我的添加报告中,我只是通过这样做来调用 this.selected 中存在的数据

selectedId: UserStore.getState().selected

但是,在我的渲染中执行 selectedId 的 console.log 后,它返回未定义。这没有任何意义。 IT 应该返回在 selected() 下单击的项目

编辑:我不得不将 this.selected 的变量更改为 this.selectedData 或其他东西,由于某种原因它不会读取 this.selected。所以我现在可以阅读了。但是,一旦我更改下拉列表中的名称,就会发送新数据,但当前选中状态的任何内容都不会显示在下拉框中。

基本上,我无法在 UI 中显示我选择的内容(如果我在下拉菜单中点击“John Smith”,请填写该框,但是数据正在组件之间发送

【问题讨论】:

【参考方案1】:

所以问题是每当我从下拉列表中选择用户时,flux 都会告诉我的组件重新渲染,因此下拉列表的初始值始终相同。因此,为了使它像下拉菜单一样工作,每次我从商店中获得我选择的值时,我都会将该值设置为我的初始值。因此,在每次渲染时,它都会在下拉框中渲染正确的元素。

【讨论】:

以上是关于ReactJS 和 AltJS 使用下拉按钮的主要内容,如果未能解决你的问题,请参考以下文章

微信应用号开发知识贮备之altjs的Action和Store

如何在 ReactJS 中更改单选按钮时重置选定的下拉列表

ReactJS 中的下拉式布局问题

ReactJS - store.getState() 未定义

ReactJS:如何从输入字段的下拉列表中显示选定的值?

使用反应钩子在 REACTJS 中使用数组填充动态下拉列表的步骤