当前位置: 首页 > 面试题库 >

React Js:设置同级组件的输入值

芮化
2023-03-14
问题内容

我正在学习,ReactJS并尝试CRUD使用它开发小型表单。在这一点上,我试图input values从其他sibling component设置执行更新。在此处输入图片说明

所以,如果我clickedit button in first row的网格,Organzation NameDescription输入框应该得到"abc com""company Abc"值分别为。

var OrganizationHandler = React.createClass(
    render: function() {
        return (
            <div>
                <OrganizationAPP onOrganizationSubmit=this.handleOrganizationSubmit} />
                <OrganizationList external_DeleteOrganization={this.DeleteOrganizationFromServer} data= {this.state.data}  />
            </div>
       );
    }
});

var OrganizationList = React.createClass({
    internal_DeleteOrganization: function(id) {
        this.props.external_DeleteOrganization(id);
    },
    render: function() {
        var results = this.props.data;
        var parsed_results = results.objects;
        var that = this;
        var organizations = parsed_results.map(function(organization){
            return <Organization onDeleteOrganization={that.internal_DeleteOrganization} id={organization.id} name={organization.name} description={organization.description} />
        });

        return(
            <div>
                {organizations}
            </div>
        );
    }
});

var Organization = React.createClass({
    handleDeleteClick: function() {
        console.log(this.props);
        this.props.onDeleteOrganization(this.props.id);
    },
    handleEditClick: function () {
        alert(this.props.name);
    },
    render: function() {
        return (
            <div className="row">
                <div className="small-2 large-2 columns">{this.props.id}</div>
                <div className="small-4 large-4 columns">{this.props.name}</div>
                <div className="small-4 large-4 columns"> this.props.description}</div>
                <div className="small-2 large-2 columns">
                    <input type="button" onClick={this.handleDeleteClick} data-order={this.props.id} value="Delete" />
                    <input type="button" onClick={this.handleEditClick} data-order={this.props.id} value="Edit" />
                </div>
            </div>
        );
    }
});

var OrganizationAPP= React.createClass({
    getInitialState: function() {
        return {name: '',  description:''};
    },
    onChangename: function(e) {
        this.setState({name: e.target.value});
    },
    onChangedescription: function(e) {
        this.setState({description: e.target.value});
    },
    handleSubmit: function() {
        var name = this.refs.name.getDOMNode().value.trim();
        var description = this.refs.description.getDOMNode().value.trim();
        if (!description || !name) {
            return false;
        }

        this.props.onOrganizationSubmit('{"name":"' + name +'", "description": "' + description +'"}');
        this.refs.name.getDOMNode().value = '';
        this.refs.name.getDOMNode().value = '';
        this.setState({name: '', description: ''});
        return false;
    },
    render: function() {
        return (
            <div>
                <h1>Organization Setup:</h1>
                <form onSubmit={this.handleSubmit}>
                    <div className="row">
                        <div className="small-12 large-3 columns">
                            <label>Organization Name:</label>
                            <input type="text" ref="name" required value={this.props.name} onChange={this.onChangename}/>
                        </div>
                    </div>
                    <div className="row">
                        <div className="small-12 large-7 columns">
                            <label>description:</label>
                            <input type="text" required ref="description" value={this.props.description} onChange={this.onChangedescription}  />
                        </div>
                    </div> 
                    <div className="row">
                        <div className="small-2 large-3  columns">
                            <button type="submit"> Add </button>
                        </div>
                    </div>
                </form>
            </div>
        )
    }
});

我已经成功地执行additiondeletion操作,但我不知道我该怎么设置值是在输入框编辑从同级组件。如果您什么都不懂,请告诉我,因为我刚刚开始学习reactjs,我知道我的代码不符合要求。


问题答案:

这是一个列表编辑应用程序示例,其中,通过父输入(很容易成为兄弟姐妹)完成项目内容的编辑。

/** @jsx React.DOM */

//React is for rendering our app UI. 
//Not for writing the app. 
//So the first step is building out your logic in whatever you prefer.
//That could be Backbone, some other framework, or plain JS as we do here.

//our app
var app = {

  //we'll tell this listener when we change
  listener: null,

  //a cheap way of creating IDs for our new data
  nextId: 3,

  //pre-populate our data
  rows: [
    {id: 1, name: "entry 1"},
    {id: 2, name: "entry 2"}
  ],

  //what data are we focused on
  focusedId: 1,

  //add a new row of data and set it to focused
  addRow: function () {
    var id = this.nextId++;
    this.rows.push({id: id, name: ("entry " + id)});
    this.setFocusedId(id);
  },

  //get the name property given the data id
  getName: function(id){
    return _.findWhere(this.rows, {id: id}).name;
  },

  //update the name property of the currently focused data
  updateName: function (name) {
    var id = this.focusedId;
    _.findWhere(this.rows, {id: id}).name = name;
    this.listener.changed();
  },

  //set the focused data
  setFocusedId: function (id) {
    this.focusedId = id;
    this.listener.changed();
  },
};

//a row component 
var Row = React.createClass({
  render: function () {
    if (this.props.focused) {
      return <span>Value: {this.props.name} [editing]</span>;
    } else {
      return <span>
      Value: {this.props.name} 
        [<a href='#' onClick={this.props.focus}>edit</a>]
      </span>;
    }
  }
});

//the main view
var View = React.createClass({

  //our state is the app
  getInitialState: function () {
    return {
      app: app
    };
  },

  //before we render, start listening to the app for changes
  componentWillMount: function () {
    this.state.app.listener = this;
  },

  //update if the app tells us it changed
  changed: function () {
    this.forceUpdate();
  },

  //a handler we'll use for input fields
  textChanged: function (event) {
    this.state.app.updateName(event.target.value);
  },

  //let's render
  render: function () {
    var app = this.state.app;

    //build an array of row components
    var rows = _.map(app.rows, function (row) {
      var focus = function () {
        app.setFocusedId(row.id);
      };
      //the actual row component
      //give the row a unique id
      //give it a name, the focus handler function,
      //and tell it if it has the current focus
      return <li key={row.id}>
        <Row 
          name={row.name}
          focused={row.id == app.focusedId}
          focus={focus}
        />
      </li>;
    });
    //the main app view
    return <div>
    EDIT:
      <input 
        type="text" 
        value={app.getName(app.focusedId)} 
        onChange={this.textChanged}
      />
      <ul>{rows}</ul>
      <a href="#" 
        onClick={function(){app.addRow()}}>
        add row
      </a>
    </div>;
  }
});

React.renderComponent(
    <View />
    , document.body);

这是一个工作示例: http :
//jsbin.com/laxejufila/2/edit



 类似资料:
  • 当对输入字段使用默认值时,如何绕过带有道具状态的反模式? 在呈现窗体时,它应该包含一些默认值。当我设置一些值并关闭表单,然后重新打开表单时,我希望显示默认值,而不是以前输入的值······ 但是当我让state从道具继承值时,道具就永远改变了。我还没找到绕过这个的方法。

  • 问题内容: 我有文件上传输入: 我这样处理上传: 如果我两次上传相同的文件,则不会触发上传事件。我该如何解决?对于简单的js代码,只需执行以下操作:this.value = null; 在变更处理程序中。我该如何使用ReactJS? 问题答案: 我认为您可以像这样清除输入值: 文件输入无法控制,没有React特定的方式来实现。

  • 我已经看到了一些解决这个问题的繁重解决方案,在React中使用ref或事件处理程序。我想知道样式化组件中是否有解决方案。 下面的代码显然不正确。当输入子组件具有焦点时,我正在尝试找出设置父组件样式的最简单方法。这是否可以使用样式化组件? 实现这一点的最佳方法是什么,特别是考虑到样式化组件,即使这意味着依赖上面提到的React方法之一?

  • 问题内容: 有没有一种方法可以设置文件输入()的值,还是为了安全起见将其全部阻止?我正在尝试使用Google Gears的openFiles创建一个简单的多上传器。 注意: 以下答案反映了2009年旧版浏览器的状态。现在,您实际上可以在2017年使用JavaScript动态/以编程方式设置文件输入元素的值。 有关详细信息和演示,请参见此问题的答案: 如何以编程方式设置文件输入值(即:拖放文件时)?

  • 我是新来的反应,我有一个问题,也许很简单,但我还无法弄清楚。 我有一个调用const组件子组件的const组件父组件,我想要的是将值从父组件传递给子组件,如果值在子组件中被编辑,父组件可以访问编辑后的值。 我想要的是这个,下面的const组件是子组件,它只是渲染一个地图,如果您单击它设置const selectedPotionwith经度和纬度,我希望const组件父组件传递经度和纬度的初始值,每

  • 我第一个反应项目的第一个问题。 我试图找出如何在特定的onClick链接上对组件产生最佳效果,以便能够重新触发此效果,而不受页面上其他链接的影响。前两个问题是有效的,但我似乎没有其他链接不影响组件。 我有一个DisplayLightbox组件在我的页面上接受几个值 我想要触发lightbox的链接正在调用一个设置状态(并发送道具)的函数。这部分似乎很好用。 在我的DisplayLightbox组件