【问题标题】:Reactjs send data through pages and componentsReactjs 通过页面和组件发送数据
【发布时间】:2020-01-30 22:04:56
【问题描述】:

我有一个名为:List.js 的页面,它呈现组件:Box 用于 List 页面上的每个项目。我的 List.js 还包含一个名为:MainSpace 的组件。现在每个 Box 组件都将包含一个 button 和一个 onClick 函数。根据您单击的 Box 组件,我想用来自该特定 Box 组件的数据填充 MainSpace,但我似乎无法弄清楚如何做到这一点。

render() {

   for (let index in data) {
      list.push(
        <Box data={data[index]}/>
      );
   }
   return (
   <div>
    {list}
    <MainSpace>

   </div>
   );
}

现在 Box 组件看起来像这样:

class Box extends Component {
fillMainSpace(){
//Send this.prop.data to the list.js file and fill the MainSpace component from there I think?
}

render(){
   return (
   <div>
       <span>{this.props.data.text}</span>
       <button onClick={this.fillMainSpace}></button>
   </div>
   );
}
}

Mainspace 没有太多。例如,我只想从 Box 组件的单击按钮中加载 this.props.data.image。即使console.log(this.props.data); 也足够了。在每个&lt;Box&gt; 组件中调用&lt;MainSpace&gt; 组件不是一种选择,因为这会导致大量不必要的额外组件。

所以我的问题是:

如何访问&lt;Box&gt; 组件的单击按钮的this.props.data 并在我的&lt;MainSpace&gt; 组件中使用它?

编辑: 添加 MainSpace 组件:

class MainSpace extends Component {

render(){
    return (
     <div>
     {this.props.data.image}
     </div>
    );
}

}

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    您可以将所选项目保存为selectedItem 等状态,然后将该数据传递给 MainSpace

    const List = props => {
      const [selectedItem, setSelectedItem] = useState(props.data[0]);
      const onSelect = item => {
        setSelectedItem(item);
      };
      return (
         <div calssName="list">
         {props.data.map(item => <Box data={item} onSelect={onSelect} />)}
         <MainSpace data={selectedItem} />
       }
    }
    
    const Box = props => {
       const { data, onSelect } = props;
       return (
         <div>
            <span>{data.someKey}</span>
            <button onClick={() => onSelect(data)} >Select</button>
         </div>
       );
    };

    使用类组件

    class Box extends Component {
      fillMainSpace = () => {
        const { onSelect, data } = this.props;
        onSelect(data);
      }
    
      render(){
         const { data } = this.props;
         return (
         <div>
             <span>{data.text}</span>
             <button onClick={this.fillMainSpace} }></button>
         </div>
         );
      }
    }
    
    class List extends React.Component {
    
      state = { selectedItem: this.props.data[0] };
      
      onSelect = item => {
         this.setState({ selectedItem: item });
      }
      render() {
         const { data } = this.props;
         const { selectedItem } = this.state;
         const list = data.map(item =>  <Box data={item} onSelect={this.onSelect} />);
         return (
           <div>
            {list}
            <MainSpace data={selectedItem}>
           </div>
         );
      }
    }

    【讨论】:

    • 抱歉,我对 ReactJS 还很陌生,我想指出 list.jsBoxMainSpace 都在单独的文件中。那么我将如何传递数据还是什么都不会改变?
    • 好的,我以为你会明白的。您能否分享完整的组件类而没有不必要的方法,这些方法足以理解。
    • 对不起,你是什么意思?这些组件中没有其他任何东西。 Box 字面上由文本和一个按钮组成,而 mainspace 只是一个 div,其中的文本应根据点击而改变
    • 您的 for 循环在渲染函数之外。你是怎么做到的?
    • 对不起,这是我的错误。 for 循环在渲染中。糟糕的是,我只是手动输入了重要部分,然后将 for 循环放在了我的问题中的错误位置。我会编辑它。
    猜你喜欢
    • 2018-06-15
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2016-03-18
    • 1970-01-01
    • 2012-11-17
    • 2021-05-28
    • 2014-04-02
    相关资源
    最近更新 更多