当前位置: 首页 > 知识库问答 >
问题:

Reactjs重置道具的组件WillReceiveProps

益阳平
2023-03-14

我第一个反应项目的第一个问题。

我试图找出如何在特定的onClick链接上对组件产生最佳效果,以便能够重新触发此效果,而不受页面上其他链接的影响。前两个问题是有效的,但我似乎没有其他链接不影响组件。

我有一个DisplayLightbox组件在我的页面上接受几个值

<div>
  <DisplayLightbox 
    showLightbox = {this.state.showLightbox} 
    lightboxValue = {this.state.travelCity}  
  /> 
</div>

我想要触发lightbox的链接正在调用一个设置状态(并发送道具)的函数。这部分似乎很好用。

onClick={() => this.showLightbox(el.field_city)}

showLightbox(travelCity){
  this.setState({
    showLightbox: true,
    travelCity: travelCity,
  });
}

在我的DisplayLightbox组件中,组件WillReceiveProps确实将state设置为true,这将在div中添加lb-active类,该类从css中显示Lightbox div。这似乎很好。

class DisplayLightbox extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
    showLightbox: false, 
    };
  }

  componentWillReceiveProps(nextProps) {
    if (nextProps.showLightbox !== this.state.showLightbox) {
      this.setState({ showLightbox: nextProps.showLightbox });
    }
  } 

  closeLightbox() {
    this.setState({
      showLightbox: false,
    });
  }

  render() {
    var lbActive = (this.state.showLightbox === true) ? "lb-active" : "" 
    return <div className={"lightbox " + lbActive }>
    <div className={"lightbox-close " + lbActive }  onClick={() => 
  this.closeLightbox()}>CLOSE</div>
    Copy in lightbox
    </div>;
  }
}

研究一下,我发现由于道具不受组件和只读控制,一旦它被设置为True,我通过将show Lighbox的状态设置为false来关闭div,下一个Props.showLightbox仍然是true。因此,如果我关闭它(CloseLightbox),并单击不同的点击我的页面,它仍然会查看我的组件,看到nextProps.showLightbox仍然设置为TRUE并打开Lightbox。

我只想打开灯箱,如果那个特定的链接是被点击的。让每一个其他链接都将show Lightbox的状态设置为假似乎有些过分,所以我想我没有正确地看待这个问题。

谢谢

共有3个答案

卢永寿
2023-03-14

基于这些精彩的回复,我把孩子的照片收了出来,然后又回到了父母的身边。为此,我向父对象添加了一个lightbox按钮div

        <div className={"lightbox-button " + this.state.showLightbox} onClick={() => this.showLightbox()}></div>

       <DisplayLightbox 
       showLightbox = {this.state.showLightbox} 
      lightboxValue = {this.state.travelCity}  /> 

这将调用与showLightbox相同的函数,我稍微修改了它以进行切换

  showLightbox(travelCity){
this.setState({
  showLightbox: !this.state.showLightbox,
  travelCity: travelCity,
});

}

使用css,我会隐藏这个lightbox按钮,除非this.state.showLightbox为true。发生这种情况时,将显示该按钮,并在单击时切换showLightbox状态,从而删除灯箱和按钮。

不确定这是否是理想的解决方案,但似乎有效。

拓拔高畅
2023-03-14

如果其他链接都将showLightbox的状态设置为false,那就太过分了,所以我猜我没有正确地看待这个问题。

那么,为什么不只配置一个要打开/关闭灯箱的链接呢?

在我看来,从父组件或外部组件获取其活动状态的组件,不必费心在自己的状态下管理它。
您可以在父级状态下管理开/关状态,并将isOnonClose事件处理程序传递给LightBox
单击LightBox后,它将调用传递给它的处理程序,父级将更改事件的状态isOnfalse,这将为LightBox触发一个带有新道具isOn的渲染,这次它的值为false
单击外部链接/按钮时,父级将监听该道具并将isOn的状态更改为true,同样地,isOn将传递给LightBox,其闪亮的新值为true

小例子:

const cities = ["ny", "tlv", "ark"];

class Button extends React.Component {
  constructor(props) {
    super(props);
    this.onClick = this.onClick.bind(this);
  }

  onClick() {
    const { item, onClick } = this.props;
    onClick(item);
  }

  render() {
    return <button onClick={this.onClick}>{this.props.children}</button>;
  }
}

class LightBox extends React.Component {
  constructor(props) {
    super(props);
    this.onClick = this.onClick.bind(this);
  }

  onClick() {
    const { city, onClick } = this.props;
    onClick(city);
  }

  render() {
    const { isOn } = this.props;
    const css = `lightBoxStyle ${isOn && "onStyle"}`;
    return (
      <div 
        className={css}
        onClick={this.onClick}>
        |
      </div>
    );
  }
}

class App extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      turnedOn: []
    };

    this.on = this.on.bind(this);
    this.off = this.off.bind(this);
  }

  on(city) {
    const { turnedOn } = this.state;
    if (turnedOn.find(c => c === city)) {
      return;
    }
    const nextState = [...turnedOn, city];
    this.setState({ turnedOn: nextState });
  }

  off(city) {
    const nextState = this.state.turnedOn.filter(c => c !== city);
    this.setState({ turnedOn: nextState });
  }

  render() {
    const { turnedOn } = this.state;
    return (
      <div>
        {cities.map((city, i) => {
          const isOn = turnedOn && turnedOn.includes(city);

          return (
            <div style={{ display: "inline-block", margin: "0 10px" }}>
              <LightBox city={city} isOn={isOn} onClick={this.on} />
              <hr />
              <Button item={city} onClick={this.off}>
                Close the light!
              </Button>
            </div>
          );
        })}
      </div>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
css prettyprint-override">.lightBoxStyle{
  border: 1px solid #eee;
  width: 30px;
  height: 30px;
  text-align: center;
  box-shadow: 0 0 4px 1px #222;
  border-radius: 50%;
  margin: 0 auto;
  cursor: pointer;
}

.onStyle{
  background-color: #333;
  color: #fff;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

景麒
2023-03-14

您可以将您的CloseLightbox方法移动到上层组件,并从父组件管理show Lightboxprop。然后组件DisplayLightbox将有3个道具:show LightboxTravel City和方法CloseLightbox

当您将关闭Lightbox移动到父组件时,事件组件WillReceiveProps应该不再需要。

 类似资料:
  • 我实际上正在学习reactjs,并且实际上正在开发一个小的TODO列表,包装在一个名为TODO的“父组件”中。 我决定将初始化移到componentDidMount内部,但这似乎是一个反模式,我需要另一个解决方案。你能帮我吗? 下面是我的实际代码:

  • 问题内容: 如何在不暴露URL的情况下将prop与组件一起传递? 这样吗?我正在使用。 问题答案: 您可以这样传递数据: 这是您可以访问的方式: 该API文档解释了如何通过状态和其他变量重定向/历史道具。 来源:https : //github.com/ReactTraining/react-router/blob/master/packages/react- router/docs/api/Re

  • 问题内容: 我有以下基于渲染下拉列表呈现用户的类。如果我选择“字母”,则将按字母顺序列出用户;当我选择“组”时,将按组顺序列出用户。 在组件中,我正在通过props.members中的函数设置组件状态对象。 当我选择“组”排序时,组件正在卸载并且正在DOM中安装。同样,当我切换回“字母”排序时,在组件中预先设置的状态变量(成员)将变为NULL,因为该组件已从DOM中删除。 重新渲染b’coz时道具

  • 问题内容: 将组件存储在变量中后,需要设置组件的道具,这是伪代码: 在内部,我运行一个循环,需要为存储在变量内的组件设置道具…。如何为之前存储在变量中的该组件设置道具? 问题答案: 正确的方法是使用React的cloneElement方法(https://facebook.github.io/react/docs/react- api.html#cloneelement )。您可以通过执行以下操作

  • 假设我想做这么简单的事 在这里,什么样的道具适合儿童? 其中子级可以是由scrollView、TextInput、Text等组成的本地组件

  • 是否更像React的方法,使我们的模型属性,并在保存之前将其编译回模型,如下所示: 这不需要调用,但是随着模型的增长,(post可能有作者、主题、标记、注释、评分等)组件开始变得非常复杂。 第一种方法是ReactLink吗?