React 16:使用钩子和功能组件时从父级调用子级函数

时间:2019-09-21 03:49:24

标签: javascript reactjs

我需要在其父组件中调用子函数。我该怎么办?在React 15的上一篇文章中,我可以使用ref来调用子函数。但是不知道如何使用挂钩和功能组件。

function Child(props) {
    function validate() {
        // to validate this component
    }

    return (
        <>Some code here</>
    )
}


function Parent(props) {
    const refs = useRef([]);
    const someData = [1,2,3,4,5];

    function validateChildren() {
        refs.current.forEach(child => {
            child.current.validate(); // throw error!! can not get validate function
        });
    }

    return (
        <>
            <button onClick={validateChildren}>Validate</button>
            {
                someData.map((data, index) => {
                    return <Child ref={ins => refs.current[index] = ins} />
                })
            }
        </>
    )
}

我的实际要求是:  1.可以添加多个选项卡,根据用户的行为删除  2.单击选项卡父级中的一个按钮以触发验证  3.所有选项卡都需要进行自我验证,在其选项卡中显示错误消息并返回验证消息

1 个答案:

答案 0 :(得分:1)

您可以将lst1 <- list(c("hiv3=0", "comdiab=0", "ppl=0"), c("fxet3=1", "hiv3=0", "ppl=0"), c("fxet3=1", "escol4=0", "alcool=0", "tipores3=1"), c("escol4=0", "alcool=0", "ppl=0", "tipores3=1")) forwardRef结合使用。

docs

  

useImperativeHandle 自定义使用ref时公开给父组件的实例值。与往常一样,在大多数情况下应避免使用ref的命令性代码。 useImperativeHandle 应该与 forwardRef

一起使用
useImperativeHandle

在父组件中,您可以按以下方式访问子功能

const Child = React.forwardRef((props,ref) => {

    //validate will be available to parent component using ref
    useImperativeHandle(ref, () => ({
      validate() {
        // to validate this component
        console.log("I'm clicked");
      }
    }));

    return (
        <>Some code here</>
    )
})

Demo