下面是两个具有相同功能的react 组分.一个是函数;另一个是班级.每个组件都有一个Animated.Value,带有一个异步侦听器,可以在发生更改时更新_foo.我需要能够在功能组件中访问_foo,就像在classic 组件中访问this._foo一样.

  • 如果FunctionalBar个以上,则全局的FunctionalBar个不应包含_foo个.
  • FunctionalBar不能在函数作用域中包含_foo,因为每次FunctionalBar渲染时都会重新初始化_foo._foo也不应处于状态,因为组件在_foo更改时不需要渲染.
  • ClassBar没有这个问题,因为它在组件的整个生命周期内保持_foothis上初始化.

如何在FunctionalBar的整个生命周期中保持_foo的初始化,而不将其置于全局范围内?

功能实现

import React from 'react';
import { Animated, View } from 'react-native';

var _foo = 0;

function FunctionalBar(props) {

  const foo = new Animated.Value(0);

  _onChangeFoo({ value }) {
    _foo = value;
  }

  function showFoo() {
    let anim = Animated.timing(foo, { toValue: 1, duration: 1000, useNativeDriver: true });
    anim.start(() => console.log(_foo));
  }

  useEffect(() => {
    foo.addListener(_onChangeFoo);
    showFoo();
    return () => foo.removeListener(_onChangeFoo);   
  });

  return <View />;

}

classic 实现

import React from 'react';
import { Animated, View } from 'react-native';

class ClassBar extends React.Component {

  constructor(props) {
    super(props);
    this.state = { foo: new Animated.Value(0) };
    this._foo = 0;
    this._onChangeFoo = this._onChangeFoo.bind(this);
  }

  componentDidMount() {
    this.state.foo.addListener(this._onChangeFoo);
    this.showFoo();
  }

  componentWillUnmount() {
    this.state.foo.removeListener(this._onChangeFoo);
  }

  showFoo() {
    let anim = Animated.timing(this.state.foo, { toValue: 1, duration: 1000, useNativeDriver: true });
    anim.start(() => console.log(this._foo));
  }

  _onChangeFoo({ value }) {
    this._foo = value;
  }

  render() {
    return <View />;
  }

}

推荐答案

useRef挂钩不仅适用于DOM引用,还可以存储任何您喜欢的可变值.

Example

function FunctionalBar(props) {
  const [foo] = useState(new Animated.Value(0));
  const _foo = useRef(0);

  function showFoo() {
    let anim = Animated.timing(foo, { toValue: 1, duration: 1000, useNativeDriver: true });
    anim.start(() => console.log(_foo.current));
  }

  useEffect(() => {
    function _onChangeFoo({ value }) {
      _foo.current = value;
    }

    foo.addListener(_onChangeFoo);
    showFoo();
    return () => foo.removeListener(_onChangeFoo);
  }, []);

  return <View />;
}

Reactjs相关问答推荐

阻止在ShadCN和React中的FormLabel中添加 colored颜色

在react中向数组状态添加值时出错

Formik验证不适用于物料UI自动完成

try 在Dockerfile中使用AWS CLI将React构建工件上传到S3时出错

将对象添加到集合中的数组时的no_id字段

以下代码是否存在安全问题?

如何在react 流中使用文本区域和改变 node 的输入大小?

错误./src/TopScroll.js 31:21-31导出';(作为';随路由导入)在';Reaction-Router-Dom';中找不到

蚂蚁 Select .列表弹出窗口不会';有时不会出现

UseEffect 似乎不适用于页面的首次渲染

如何在使用 React Router v6 将当前页面的状态传递给上一页的同时导航到上一页?

有没有办法在用户离开页面时防止输入模糊?

需要先填写依赖输入字段,以便其他人工作

如何实现 redux 工具包来注册用户?

RTK 查询Mutations 在 StrictMode 中执行两次

如何解决在 react.js 中找不到模块错误

哪个是创建 React 应用程序的更好方法?

如何在 React JS 上使文本中的单词可点击

React 检测哪些 props 在 useEffect 触发器上发生了变化

为什么重新渲染不会影响 setTimeout 的计数?