我有一个登录和注册组件,这些组件是在不赞成使用这些方法之前创建的表单,我一直在寻找,但是似乎找不到解决方案,我将如何重构它以使用{{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")
}
}
答案 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)
由于您使用componentWillReceiveProps
与props
保持本地状态同步,因此有两种选择:
根据道具声明您的初始状态,并使用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 }
}
}