如何替换此组件WillReceiveProps?

时间:2019-12-02 16:32:30

标签: javascript reactjs

我有一个登录和注册组件,这些组件是在不赞成使用这些方法之前创建的表单,我一直在寻找,但是似乎找不到解决方案,我将如何重构它以使用{{1 }}?

import Foundation
import SwiftUI
import UIKit

struct AnotherControllerView : UIViewControllerRepresentable {

    typealias UIViewControllerType = AnotherController

    func makeCoordinator() -> AnotherControllerView.Coordinator {
        Coordinator(self)
    }

    func makeUIViewController(context: UIViewControllerRepresentableContext<AnotherControllerView>) -> AnotherController {

        return AnotherController()
    }

    func updateUIViewController(_ uiViewController: AnotherController, context: UIViewControllerRepresentableContext<AnotherControllerView>) {

    }


    class Coordinator : NSObject {
        var parent : AnotherControllerView
        init(_ viewController : AnotherControllerView){
            self.parent = viewController
        }
    }
}

class AnotherController : UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor.blue
    }

    func savePhoto(){

        let alert = UIAlertController(title: "Save Photo to Camera Roll", message: "Would you like to save your drawing to the camera roll?", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
        alert.addAction(UIAlertAction(title: "Save", style: .default, handler: someHandler))
        self.present(alert, animated: true)
    }

    func someHandler(alert: UIAlertAction!) {
        print("Handler executed")
    }
}

2 个答案:

答案 0 :(得分:3)

提出的问题的答案可能不会令人满意。 :-)答案是如果您确实需要从道具派生状态(you probably don't,只需直接在props.errors中使用render),则可以使用较新的getDerivedStateFromProps static方法,它接受道具和状态并(可能)返回状态更新以应用:

static getDerivedStateFromProps(props, state) {
    return props.errors ? {errors: props.errors} : null;
}

或具有解构功能且没有未使用的state参数:

static getDerivedStateFromProps(({errors})) {
    return errors ? {errors} : null;
}

但是 ,您是在说“但这不做身份验证吗??”没错,因为没有componentWillReceiveProps,也违反了规则props are read-only。所以那部分不应该在那里。相反,如果应该在props.history中存在该条目,则应由父组件将其放置在那里。

答案 1 :(得分:1)

由于您使用componentWillReceivePropsprops保持本地状态同步,因此有两种选择:

根据道具声明您的初始状态,并使用componentDidUpdate确保道具同步

class Component extends React.Component{
    state = { foo : this.props.foo }

    componentDidUpdate(prevProps){
        if(this.props.foo !== prevProps.foo)
            this.setState({ foo : prevProps.foo })
    }
}

这实际上每次都会触发一个额外的渲染,如果您的局部状态始终等于某个道具,则可以直接使用道具。

使用getDerivedStateFromProps根据道具更改来更新状态,但请记住you probably don't need to use it

class Component extends React.Component{
    static getDerivedStateFromProps(props){
        return { foo : props.foo }
    }
}