javascript - 更改道具值外部反应并重新加载组件
问题描述
正如标题所说,我想在外部 js 文件中更改 props 的值并重新加载组件。
<div data-group=""></div>
//external.js
const popupChat = document.getElementById('popupChatComponent');
popupChat.setAttribute('data-group', groupId);
//component.ts
export default class PopupChatRoot extends React.Component {
private readonly groupId: string;
constructor(props) {
super(props);
this.groupId = this.props.group;
}
render() {
return (
<div className="modal-body">
<p>{this.groupId}</p>
</div>
);
}
}
const component = document.getElementById('popupChatComponent');
if (component) {
const props = Object.assign({}, component!.dataset);
render(<PopupChatRoot {...props}/>, component);
}
我怎么能做到这一点?
解决方案
您可以做的是使用包装器组件或更高阶的组件,它为您的组件提供这些道具,并让该包装器组件与您的外部 javascript 代码集成。
这是我用来做类似事情的 HOC:
export interface MyHocProps {
//the props you want to provide to your component
myProp: any;
}
export const withMyHOC = <T extends any>(params: any) =>
<P extends MyHocProps>(WrappedComponent: React.ComponentType<P>): React.ComponentClass<defs.Omit<P, keyof MyHocProps>> => {
return class extends React.PureComponent<defs.Omit<P, keyof MyHocProps>> {
//here you have access to params, which can contain anything you want
// maybe you can provide some sort of observable which causes this to re-render
render() {
return <WrappedComponent
{...this.props}
myProp={/*whatever*/}
/>;
}
}
};
从这里,您可以将此 HOC 与某种系统集成以将更改推送到它。我建议使用可观察的。基本上你想让这个 HOC 组件订阅一些可观察数据的变化,然后在它发生变化时强制它自己重新渲染。
或者,如果它只是一个单例,您可以通过执行类似的操作在组件上公开一些方法window.reloadThisComponent = this.reload.bind(this);
,但这可能应该被视为最后的手段。
推荐阅读
- java - 使用spring显示数据的问题
- java - Intellij 方法类型迁移 - 更改返回对象的调用
- amazon-web-services - 将 SSH 流量从一个 IP 重定向到另一个 IP(读取文件)
- swift - 为 ARAnchor 实现 Codable:“无法在扩展中自动合成……”
- javascript - 如何像翻转硬币算法一样创建“随机选择”
- c# - 为什么 WM_NCACTIVATE 消息没有发送到 SizeToContent 设置为 Height 的窗口
- ios - 移除导航栏和工具栏的边框
- html - CakePHP - 在 CakePHP 表单帮助链接中添加 HTML 内容的最佳方法?
- sql - UPDATE table_name SET col_name = varchar WHERE col_name 为 NULL;
- javascript - 如何让 HTML 对象上的事件侦听器与 React 相处?