将Onclick值传递给另一个组件

时间:2017-01-25 15:38:43

标签: reactjs

Javascript和React的新功能..使用它来制作实践用户界面

我似乎无法传递OnClick值,即使是作为子道具也可以使用另一个组件。 我开始觉得这不是一个好方法..我能够将onClick的值传递给Checkkey函数并在MainList中呈现它....即时尝试将id的值传递给OnClick函数中的Checkkey 。

我的逻辑是,每当用户点击边栏列表时,div中另一边的视图应该更改为另一个组件。该列表的id将与组件id或div id进行比较并相应地更改视图,但是现在我只是在渲染中使用条件,如果id = 1显示一个组件,如果id = 2则显示第二个组件。但是我无法将onOnclick中的id传递给条件组件。

class MainList extends React.Component {

  render() {
  return (
    <div>
  <ListArea listlinkarray={ListNameAndLinks}/>
  <Checkthekey/>

    </div>
  );

 }
}

将值传递给函数中的某个组件是否可以?

 class ListArea extends React.Component {

   onClick(keyd){
    console.log(keyd);

    <Checkthekey keydata={this.props.keyd}/>   // is this acceptable ?
}

  render() {

var rows = [];
 this.props.listlinkarray.forEach((linklist)=>{
    rows.push(<ListArray linklist={linklist} key={linklist.name} onClick={this.onClick.bind(this)}/>);
 });
    return (

      <div> 
     <h3> ListHead </h3>
      {rows}
      </div>
      </div>
    );
  }
}

class ListArray extends React.Component {
  getComponent(keyd) {
   this.props.onClick(keyd);
}
  render() {
 return (
  <div>

       <ul><li onClick={this.getComponent.bind(this,this.props.linklist.id)}>{this.props.linklist.name}</li></ul>
    </div>
    );
  }
}

想要将onclick值传递给此函数,以便每当用户点击列表项时我都可以使用它来更改视图。

function Checkthekey(props) {
   var keydata= props.keydata

     if (keydata == 1) {
    return <UIone />;
  } else if (keydata ==2 )
  return <UItwo />;
   else return <UIone/>
  }

id来自的数组

 var ListNameAndLinks= [
{ name:'ABC', id:1} ,
{ name:'BCD', id:2} 
 ];


  ReactDOM.render(<MainList/>, document.getElementById('container'));

1 个答案:

答案 0 :(得分:1)

坚持使用JavaScript命名约定并将camelCase用于变量。我转换了一些,但你可以休息。

class MainList extends React.Component {
    constructor(props) {
        super(props);

        this.updateKey = this.updateKey.bind(this);
        this.state = {};
    }
    updateKey(keyData) {
        this.setState({ keyData: keyData });
    }
    render() {
      return (
        <div>
            <ListArea listLinkArray={ListNameAndLinks} updateKey={this.updateKey} />
            <Checkthekey keyData={this.state.keyData}/>
        </div>
      );
    }
}

在循环和渲染子项时使用map而不是forEach,它更容易,代码更少。 尽可能在构造函数中绑定而不是render,因为它只会绑定一次而不是每个render

class ListArray extends React.Component {
    constructor(props) {
        super(props);

        this.onClick = this.onClick.bind(this);
    }
    onClick(keyData){
        this.props.updateKey(keyData);
    }
    render() {
        return (
          <div> 
            <h3> ListHead </h3>
            <ul>
                {this.props.listLinkArray.map(linklist => <ListItem linklist={linklist} key={linklist.name} onClick={this.onClick} />)}
            </ul>
            </div>
          </div>
        );
    }
}

不要把div放在ul里面,不是有效的html。 不要像你正在做的那样在每个循环上渲染ul,而是在每个循环上渲染li。

class ListItem extends React.Component {
  render() {
    return <li onClick={this.props.onClick.bind(this, this.props.linklist.id)}>{this.props.linklist.name}</li>;
  }
}

不要使用switch语句,而是在数组中使用自定义组件的名称类型并将其传递给createElement

function Checkthekey(props) {
    var keydata= props.keydata

    return React.createElement(props.keyData);
}

 var ListNameAndLinks= [
    { name:'ABC', id: 'UIone'} ,
    { name:'BCD', id: 'UItwo'} 
     ];


ReactDOM.render(<MainList/>, document.getElementById('container'));