【问题标题】:How do you use multiple react components on the same element?你如何在同一个元素上使用多个反应组件?
【发布时间】:2020-01-09 20:33:59
【问题描述】:

我想悬停一个 div,在该 div 中获取图像,显示它,然后使图像跟随我的光标。悬停组件正在工作,但我无法使跟随光标组件工作。你会怎么做呢?

组件编号 1:

import React from 'react';

class FollowMouse extends React.Component {

    state = {
        xPos: 0,
        yPos: 0
    };

    onMouseMove(e) {
        this.setState({
            xPos: e.screenX,
            yPos: e.screenY
        });
    }

    render() {
        return (
            <div
                onMouseMove={this.onMouseMove.bind(this)}
                className="img-ctn"
            >
                {this.props.children(this.state.xPos, this.state.yPos)}
            </div >
        );
    }
}
export default FollowMouse;

组件 2:

import React from 'react';

class HoverProject extends React.Component {

    state = {
        isHovered: false,
    };

    onMouseEnter() {
        this.setState({ isHovered: true });
    }
    onMouseLeave() {
        this.setState({ isHovered: false });
    }

    render() {
        return (
            <div
                onMouseEnter={this.onMouseEnter.bind(this)}
                onMouseLeave={this.onMouseLeave.bind(this)}
                className="project-item"
            >
                {this.props.children(this.state.isHovered)}
            </div >
        );
    }
}
export default HoverProject;

然后是父组件。

import React from 'react';

// modules
import HoverProject from '../modules/HoverProject';
import FollowMouse from '../modules/FollowMouse';


import VLEC from '../images/vlec.png';

class ProjectList extends React.Component {

    constructor(props) {
        super(props);

        this.sels = {
            state: 'active'
        };
    };

    render() {
        return (
            <div className="project-list module">

                <div className="sectionTitle">Project I've worked on</div>

                {this.props.data.map((res, i) => (
                    <HoverProject key={i}>
                        {
                            isHovered =>
                                <div className="inner-ctn">
                                    {/* <FollowMouse /> */}
                                    <img className={"project-image " + (isHovered ? this.sels.state : "")} src={VLEC} alt="VLEC" />
                                    <div className="header">
                                        <div className="number">0{res.id + 1}</div>
                                        <div className="name">{res.nomProjet}</div>
                                    </div>
                                    <div className="item-ctn">
                                        <div className="categ">{res.categProjet}</div>
                                        <div className="roles">{res.roles}</div>
                                        <div className="date">{res.date}</div>
                                    </div>

                                </div>
                        }
                    </HoverProject>
                ))}
            </div>
        );
    }
}
export default ProjectList;

我不知道如何处理其他组件,你甚至可以像这样在父级中渲染子级吗?

我想将来自 FollowMouse 的道具作为我的 img 元素的样式属性传递。

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    我不是 100% 确定我遵循了您的问题,并且我不知道您期望 this.props.children 在作为函数调用时会做什么,但是如果您想向子元素添加道具,您可以通过React.cloneElement

    const ParentComponent ({children}) => (
      <div>
        {React.cloneElement(
          React.Children.only(children), // clone the only child...
          { style: { left: xPos, top: yPos} } // ...and add new props
        )}
      </div>
    )
    

    给定:

    <ParentComponent>
      <div>Wookies and Hats</div>
    </ParentComponent>
    

    子组件会得到额外的props,相当于:

    <ParentComponent>
      <div style={{left: xPos, top: yPos}}>Wookies and Hats</div>
    </ParentComponent>
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 2014-12-27
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2020-05-31
      相关资源
      最近更新 更多