如何从父级运行子函数?

Posted

技术标签:

【中文标题】如何从父级运行子函数?【英文标题】:How to run child function from parent? 【发布时间】:2021-11-24 05:44:05 【问题描述】:

我想通过在父视图中按下按钮来调用 childFunction() demo ChildView。

import SwiftUI

struct ChildView: View 
    
    func childFunction() 
        print("I am the child")
    

    var body: some View 
      Text("I am the child")
    


struct ContentView: View 
    var function: (() -> Void)?

    var body: some View 
        ChildView()
        
        Button(action: 
            self.function!()
        , label: 
            Text("Button")
        )
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

更新: 谢谢@RajaKishan,它可以工作,但我需要它也可以递归地工作

import SwiftUI

struct ContentView: View 
    @State var text: String = "Parent"
    var isNavigationViewAvailable = true
    
    func function() 
        print("This view is \(text)")
    
    
    var body: some View 
        
        VStack 
            if isNavigationViewAvailable  
                Button(action: 
                    function()
                , label: 
                    Text("Button")
                )
            
           
            
            if isNavigationViewAvailable 
                NavigationView 
                    List 
                        NavigationLink("Child1") 
                            ContentView(text: "Child1", isNavigationViewAvailable: false)
                        
                        NavigationLink("Child2") 
                            ContentView(text: "Child2", isNavigationViewAvailable: false)
                        
                        NavigationLink("Child3") 
                            ContentView(text: "Child3", isNavigationViewAvailable: false)
                        
                    
                
            
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

也许不是最好看的例子,但问题是,如何在用户访问相应的孩子后强制按钮运行它的孩子的功能。

就像,当用户按下按钮开始时,它会打印“这个视图是父视图”。用户来到 child1 后,按下按钮应打印“This view is Child1”,依此类推。所以,button运行的函数应该是从最后一个child引用的。

更新: 最后我写了this解决方案。

更新: 我收到反馈,要求我澄清。没问题。我希望它会帮助别人。:)

澄清: 我没有附上整个代码,只是使用了一个简单的例子。但是我在实现树状生成菜单时需要这个:当菜单中的每个项目有或没有它的子项时。按下父对象用户进入子对象。在这里,我需要能够从子对象返回到父对象,但是从父对象调用这个解除函数。为此,我使用了以下代码并将此函数引用到每个父对象:

@Environment(\.presentationMode) var presentationMode
 presentationMode.wrappedValue.dismiss()

【问题讨论】:

目前还不清楚你要做什么,但我怀疑你正在尝试做一些你不应该做的事情。视图不应包含程序代码。您可能应该操纵一个影响视图的模型 【参考方案1】:

您可以为 ChildView 创建一个对象。

struct ChildView: View 
 
    func childFunction() 
        print("I am the child")
    
    
    var body: some View 
        Text("I am the child")
    


struct ContentView: View 
    
    let childView = ChildView()
    
    var body: some View 
        childView
        Button(action: 
            childView.childFunction()
        , label: 
            Text("Button")
        )
    



EDIT:对于列表,可以使用模型的数组,通过索引调用目标函数。

这是一个简单的子父示例。

struct ChildView: View 
    var text: String
    
    func childFunction() 
        print("This view is \(text)")
    
    
    var body: some View 
        Text("I am the child")
    




struct ContentView55: View 
    
    @State private var arrData = [Model(title: "Child1", destination: ChildView(text: "Child1")),
                                           Model(title: "Child2", destination: ChildView(text: "Child2")),
                                           Model(title: "Child3", destination: ChildView(text: "Child3"))]
    
    var body: some View 
        
        VStack 
            Button(action: 
                arrData[1].destination.childFunction()
            , label: 
                Text("Button")
            )
            
            NavigationView 
                SwiftUI.List(arrData) 
                    NavigationLink($0.title, destination: $0.destination)
                
            
        
    
    

struct Model: Identifiable 
    var id = UUID()
    var title: String
    var destination: ChildView


注意:您需要为该行建立索引才能调用子函数。

【讨论】:

嗨。感谢你的回答。有用。但是在递归视图结构的情况下,当 ContentView 具有通过 NavigationLinks 创建的 ContentView 子对象时,如何解决这个问题,因为值类型不能具有递归包含它的存储属性? @DegtiarevAleksei 你能在你的问题中添加一个例子吗? 更新问题 @DegtiarevAleksei 我已经添加了编辑部分。这可能会有所帮助。 谢谢你的回答,但是我编译后按钮总是返回“This view is Child2”

以上是关于如何从父级运行子函数?的主要内容,如果未能解决你的问题,请参考以下文章

reactjs中未从父级调用子组件函数

typescript @ViewChild - 从父级访问CHILD COMPONENT。当您要在子组件中触发函数时,这非常有用。

在 useEffect() 钩子中从父级传递的子级调用函数,React

如何从父静态函数调用静态子函数?

如何将函数从父级传递给深层嵌套的子级并将@input 值用于Angular 8中传递的函数?

如何使用Vue从父级中的多个子组件中获取值?