如何使 React HOC - 高阶组件协同工作?

2024-01-04

我有一个像这样的小演示组件:

function MyList({data, uppercaseMe, lowercaseMe}) {
    return <ul>
        {data.map(item =>
            <li>{item} -
                <button onClick={() => uppercaseMe(item)}>Uppercase me!</button>
                <button onClick={() => lowercaseMe(item)}>Lowercase me!</button>
            </li>)}
    </ul>;
}

然后我想用三个 HOC 来装饰 MyList:

const WithData = (Component) => {
return class extends React.Component {

    constructor(props) {
        super(props);
        this.state= {data:['one', 'two', 'three', 'four', 'five']};
    };

    render() {
        return <Component {...this.props} data={this.state.data} />;
    }
}
};

const WithUppercase = (Component) => {
return class extends React.Component {

    uppercaseMe = (item) => {
        // how to access WithData state from here?
        console.log(item.toUpperCase());
    };

    constructor(props) {
        super(props);
    };

    render() {
        return <Component {...this.props} uppercaseMe={this.uppercaseMe}/>;
    }
 }
};

const WithLowercase = (Component) => {
return class extends React.Component {

    lowercaseMe = (item) => {
        // how to access WithData state from here?
        console.log(item.toLowerCase());
    };

    constructor(props) {
        super(props);
    };

    render() {
        return <Component {...this.props} lowercaseMe={this.lowercaseMe}/>;
    }
 }
};

像这样:

const ComposedList = WithLowercase(WithUppercase(WithData(MyList)));

不幸的是,我不知道如何从 WithLowercase 或 WithUppercase 中更改 WithData 的状态。

如何将一个 HOC 的状态公开给链中的其他 HOCS?


您不想直接暴露状态。您真正想要做的是将函数作为道具传递给包装的组件,该组件将允许您更新状态。

因此,如果我们采用 HOC 并添加一点代码,创建一个函数来更新其状态,现在可以将其传递给其子组件:

const WithData = (Component) => {
  return class extends React.Component {

      constructor(props) {
          super(props);
          this.state= {data:['one', 'two', 'three', 'four', 'five']};
      }

      update (data) {
        this.setState({ data });
      }

      render() {
          return <Component onUpdate={this.update} {...this.props} data={this.state.data} />;
      }
  }
};

现在,在子组件之一中,我们可以使用它:

const WithUppercase = (Component) => {
    return class extends React.Component {

        uppercaseMe = (item) => {
            const itemIndex = this.props.data.indexOf(item);
            const newData = this.props.data.slice();
            newData[itemIndex] = item.toUpperCase();
            this.props.onUpdate(newData); // update WithData state here
        };

        constructor(props) {
            super(props);
        };

        render() {
            // onUpdate function is once again passed to child components
            // implicitly through props if you need to call it again
            return <Component {...this.props} uppercaseMe={this.uppercaseMe}/>;
        }
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 React HOC - 高阶组件协同工作? 的相关文章

  • 用玩笑模拟高阶组件

    我想确保 HOC 组件被开玩笑地调用 但我似乎无法理解jest mock上班 我的 HOC 是这样的 const withEntity args gt const wrappedComponent WrappedComponent gt c
  • 如何在 Jasmine JS 中重用 beforeEach/afterEach?

    当使用 JasmineJS 编写测试时 我有许多具有类似 beforeEach afterEach 代码的测试 有没有办法使用 JasmineJS 测试套件实现继承模型 我可以将所有测试分组为一个describe但在这种情况下 我将以包含所
  • React:为什么内联样式需要双括号语法 style{{..}}

    我的问题涉及内联反应组件的样式 据我了解 在 JSX 中 variableName 需要大括号来引用任何 JS 变量或表达式 因此 使用以下构造添加内联样式对我来说很有意义 所需的样式存储在 JavaScript 变量中 然后在 JSX 标
  • Bootstrap 页脚不在底部

    我试图强制我的页脚位于网站底部 我不希望它在滚动时粘住 只是在向下滚动网页时出现在底部 目前 网页显示时页脚位于内容下方 我添加了这样的代码bottom 0 并发现它粘住了并且不适合我的网站 我还添加了这样的代码html body heig
  • 在 Javascript 中隐藏按钮

    在我最新的程序中 有一个按钮 单击时会显示一些输入弹出框 这些框消失后 如何隐藏按钮 You can set its visibility财产 http www w3schools com cssref pr class visibilit
  • 使用 webpack 从目录动态导入图像

    这是我当前通过 ES6 在 webpack 中导入图像和图标的工作流程 import cat from images cat1 jpg import cat2 from images cat2 svg import doggy from i
  • 为什么 jQuery 对损坏标记的解释与浏览器不同?

    我之前已经回答过这个问题 https stackoverflow com a 19101905 1253312 但我并不完全理解why答案是正确的 答案的要点 p p function jqrender html a href http w
  • 同心放射圆 d3

    我有一个等距值的数组 我用它来绘制同心圆 我想使用一种散发效果 本质上是 一旦最外面的圆的值超过最大值 就将其删除 并在中心添加一个新的圆来补偿 我不确定如何操作数据集来删除和添加新圆圈
  • 设置三个输入数字的最大值

    我有三个输入数字
  • 将jQueryUI datepicker附加到div(显示位置错误)

    我在输入上使用 jQueryUI datepicker 默认情况下 jQueryUI 会附加 ui datepicker div to the body该文件的 有问题的输入位于屏幕上的 弹出 div 中 这意味着该 div 之外的任何点击
  • Angular 4 - 具有动态参数值的自定义验证器

    我编写了一个自定义验证器 用于检查日期是否高于某个最小日期 代码如下所示 export function validateMinDate min Date ValidatorFn return c AbstractControl gt if
  • 如何在 Google 地图上旋转叠加图像?

    我正在尝试将一系列叠加层放置到 Google 地图上 我正在跟随地面覆盖层的示例代码 https developers google com maps documentation javascript examples groundover
  • 发送带有图像的嵌套 JSON

    我一直在尝试研究一种能够通过 Ajax 将嵌套 JSON 请求发送回服务器的方法 根据我的理解 我们主要用于向服务器发送图像或文件的 formdata 在这种情况下不起作用 因为 FormData 似乎不处理嵌套对象 这就是我需要发送的有效
  • jQuery onclick 隐藏其父元素[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想隐藏 li tag on a 使
  • 如何在 React Native 应用程序中的 iOS 后台运行 socket.io?

    我在用socket io in an iOS React Native v0 20 app 该应用程序会跟踪我的位置 当我的位置发生变化时 它会向服务器发送一条消息 如果套接字连接丢失 服务器会发送电子邮件通知我 我在后台进行位置跟踪反应本
  • javascript 中的工厂模式与构造函数模式[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我看到了关于 javascript 设计模式的教程 虽然教程很好 但它给我留下了很少的问题 正如我所见 工厂和构造函数产生相同的结果
  • Lighthouse 多个 URL

    我需要对一个网站进行全面审核 但我想知道是否有任何方法可以让 Lighthouse 做到这一点 我知道他们不支持完整的站点审核或多个 URL 但我发现可以使用 bash 脚本来完成 因此 我将不胜感激对此案的任何帮助 或者您可能会推荐任何灯
  • 尝试将远程图像转换为 Base64 数据时出现 CORS 错误[重复]

    这个问题在这里已经有答案了 我需要将远程图像转换为给定其 URL 的 base64 但我遇到了 CORS 错误 并且不确定如何解决 我遵循了这个问题的一些解决方案 如何使用javascript将图像转换为base64字符串 https st
  • Javascript - 通过键获取特定 JSON 数组元素内的属性值

    我有一个像这样的 JSON 结构 map key1 valueA1 key2 valueA2 key3 valueA3 key1 valueB1 key2 valueB2 key3 valueB3 key1 valueC1 key2 val
  • 如何将国家/地区代码与电话号码分开?

    我的数据库中有很多电话号码 例如 1 123 456 7890 我要做的是将国家 地区拨号代码 在本例中为美国 加拿大的 1 与电话号码分开 我尝试创建所有国家 地区的 JSON 列表 并在加载页面时将电话号码和国家 地区代码分开 它工作正

随机推荐