【问题标题】:How to send a ref to a function as a parameter in React Native?如何在 React Native 中将 ref 作为参数发送给函数?
【发布时间】:2019-10-12 19:14:24
【问题描述】:

我已将自定义 component 导入我的 screen 并在 render() 函数中呈现它。然后,为该自定义组件创建了一个ref。现在,render() 函数看起来就像这样。

render() {
  return (
    <View>
      <MyComponent ref={component => this.myComponent = component} />
    </View>
  )
}

然后,我创建了另一个函数来访问我的自定义组件的状态。我是这样写的。

myFunction = (ref) => {
  ref.setState({ myState: myValue })
}

然后,我这样调用那个函数。

this.myFunction(this.myComponent)

但是,它不起作用。它给了我以下错误。

null is not an object (evaluating 'ref.setState')

其实我需要这个myFunction做的是,

this.myComponent.setState({ myState: myValue })

你能帮我解决这个问题吗?

【问题讨论】:

    标签: javascript react-native ref


    【解决方案1】:

    要使用setState,只需使用组件的上下文(this 关键字)。上下文中也包含您的 ref,因此如果您在一个组件内(不转发给子组件),则无需将其作为参数传递

    myFunction = (event) => {
     this.myComponent  // -> points to your ref, DOM element
     this.setState() // use your setState like that
    }
    

    如果您想将处理程序传递给子组件,请不要忘记在父组件中绑定您的上下文。参考这个useful topic

    编辑:根据您的评论,我猜您想通过调用其他组件中的处理程序来更新父状态。为此,您需要在父组件中创建一个处理程序,绑定上下文并将其作为属性传递给子组件。接下来,您需要在子组件中分配此处理程序。您不能通过参数或 ref 使用 setState 方法传递上下文,这不是它在 javascript 和 react 中的工作方式。

    例子:

    // ParentComponent.js
    class ParentComponent extends React.Component {
      constructor(props) {
        super(props);
        this.state = {
          value: 1,
        };
        this.onChangeHandler = this.onChangeHandler.bind(this);
      }
    
      onChangeHandler(event) {
        this.setState({
          value: someNewValue // will update state on parent component
        })
      }
    
      render() {
        return (
          <View>
            <SomeComponent>{this.state.value}</SomeComponent>
            <ChildrenComponent onChangeHandler={this.onChangeHandler} />
          </View>
        );
      }
    }
    
    // ChildrenComponent.js
    const ChildrenComponent = (props) => (
      <View>
        <Button
          onPress={props.onChangeHandler}
          title="click me to change parent state"
        />
      </View>
    );
    

    希望这是你需要的:)

    【讨论】:

    • 您能否将您的答案编辑为完整答案?我的意思是,完整的函数,我需要知道我应该如何调用函数。
    • 这取决于你想用那个函数做什么。你能解释一下你的具体情况吗?
    • 没有任何功能我也能做到。但是,我想知道如何通过该功能来做到这一点。你能看看我在我的问题中需要什么吗?非常感谢您能帮我解决这个问题。
    • 我已经编辑了答案,如果您还有其他问题,请询问
    【解决方案2】:

    ref 不是你的 this 对象。这是您的组件的 dom。对于 setState,您需要这个组件。

    您可以将其作为参数传递。

    myFunction(this)

    现在您可以在 myFunction 中执行 ref.setState。

    function myFunction(ref) {
        ref.setState({ myState: myValue })
    }
    

    【讨论】:

    • 您能进一步解释一下吗?如果这样写函数,应该怎么调用呢?
    • 非常感谢您能帮我解决这个问题。
    • 您可以简单地从组件中的任何位置调用 myFunction(this)。您可以在组件之外的任何地方保留功能。
    • 问题是这样的。我已经渲染了组件 4 次,并且给了它们 4 个不同的 ref s。所以,我只想为我需要的组件分别调用每个组件的这些函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2011-12-27
    • 2021-07-07
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多