当用户单击按钮时,如何使可重复使用的反应组件保存?

时间:2017-12-05 18:35:36

标签: javascript reactjs ecmascript-6 redux state

<?php $letra1 = chr(rand(65,90)); $letra2 = chr(rand(97,122)); $letra3 = chr(rand(65,90)); $letra4 = chr(rand(97,122)); $letras = $letra1 . $letra2 . $letra3 . $letra4; mkdir("a/$letras", 0777, true); //third parameter is important if you want to add perms recursively $archt = fopen("a/".$letras."/text.txt", "w")or die(print_r(error_get_last(),true)); $txt = ""; fclose($archt); ?> 时我的组件this.props.save();?但是,如果我将页面留在另一个标签中的外部链接,则不会触发componentWillUnmount

我的组件

componentWillUnmount

我的链接看起来像这样

export default class AutoSave extends React.Component {

  constructor(props) {
    super(props);
    this.setIntervalId = null;
  }

  componentDidMount() {
    if (!window.onbeforeunload) {
      window.onbeforeunload = () => {
        this.props.save();
      };
    }

    this.setIntervalId = setInterval(() => this.props.save(), this.props.intervalInMs);
  }

  componentWillUnmount() {
    this.props.save();
    clearInterval(this.setIntervalId);
  }

  render() {

    return <span className="saving">Last saved at {now()}</span>;
  }
}

如何在用户点击链接时进行组件保存?这是一个react / redux应用程序。

2 个答案:

答案 0 :(得分:2)

为什么你在一个延伸自&#34; React.Component&#34;的课程中做某种工作。在ReactJS中,Component不适合做那样的工作。从官方文档&#34;组件中,您可以将UI拆分为独立的,可重复使用的部分,并单独考虑每个部分。&#34;除了与ui相关的范围外,组件中没有任何部分。无论如何,您应该将AutoSave创建为纯组件并在所有React组件中使用它。 :

export default class AutoSave 
{
  constructor(saveFn, intervalInMs) {
    this.saveFn = saveFn;
    this.setIntervalId = setInterval(
        () => { 
            this.save();
        }, 
        intervalInMs
    );
  }

  unmount() {
    this.save();
    clearInterval(this.setIntervalId);
  }

  save() {
    this.saveFn();
    this.callOnSaveCallback();
  }

  onSave(callback) {
    this.onSaveCallback = callback;
  }

  // private method that calls onSaveCallback
  callOnSaveCallback() {
    if(this.onSaveCallback != null)
        this.onSaveCallback();
  }

}

并在我的React组件中使用它:

import AutoSave from './AutoSave';
export default class ReactComponent extends React.Component {
    constructor(props) {
        super(props);
        this.state = {
            // ... other properties
            "lastSave": new Date()
        }
        this.save = this.save.bind(this);
        this.autoSave = new AutoSave(this.save, 100);
        this.autoSave.onSave(
            () => {
                this.setState(
                    {
                        "lastSave": new Date()
                    }
                );
            } 
        )
    }

    componentWillUnmount() {
        this.autoSave.unmount();
        this.autoSave = null;
    }  

    onClick() {
        this.autoSave.save();
    } 

    save() {
        // some saving job
    }

    render() {
        return ( 
            <div>
                // ... other components
                <Link href="http://www.google.com"  target="_blank" onClick={this.onClick.bind(this)}>
                  Google Link
                </Link> 
                <span className="saving">Last saved at {this.state.lastSave}</span>
            </div>
        );
    } 
}

答案 1 :(得分:1)

打开新标签页不会触发componentWillUnmount()或onbeforeunload。在这两种情况下,因为您的应用仍然在原始标签中打开。在您关闭或离开页面之前,React不会立即卸载组件,因此即使页面要关闭,componentWillUnmount()也不会执行任何操作。 onbeforeunload仅在您从同一选项卡中的页面导航时触发,或者关闭选项卡/窗口。

如果你想在每次用户点击你的按钮时可靠地调用this.props.save(),那么只需在按钮上添加一个onClick处理程序。

input_seq = np.array([[[0.725323664],
                   [0.7671179],
                   [0.805884672]]])