javascript - 你如何动态地将 React 组件插入 DOM(例如对话框)?

标签 javascript reactjs

我想用处理相同任务的 React 组件替换 javascript 的内置 alert() 函数:即,向用户显示快速、可忽略的消息。

现在,我可以通过创建一个组件并将其放入我的标记中来实现这一点。例如

<div> 
    <BunchOfComponents />
    <MoreComponents />

    <MyAlertDialog open={this.props.shouldShowAlert} />
</div>

然后通过 Redex 或其他方式控制其 open 状态使其显示。

但是,我喜欢做的是,它能够在我的标记中声明它,而是注入(inject)到dom 通过一个函数。

有点像...

myCoolFunction() {
    const alert = (
        <MyAlert
            open={true}
            msg="Hello World" 
        />
    )
    DOM.findNode('someID').insert(alert);  <-- fake API obviously   
}

是否可以像这样动态附加组件?

最佳答案

这是我在工作中做的肮脏方式(听起来不对...) http://codepen.io/matthsiung/pen/JKOpVW

我确信有更好的“正确”方法来做到这一点,但它会自行清理,所以它对我有用。

这里是关键点:

对话触发器

//Your trigger function will render the dialog component to a newly created dummy div,
// while also passing it into the component as a prop

function showDialog() {
  var div = document.createElement('div');
  ReactDOM.render(
     <Dialog container={div}/>,
     document.body.appendChild(div)
  );
} 

对话框组件:

//When your dialog component closes it unmounts itself
close(){
  ReactDOM.unmountComponentAtNode(this.props.container);
},

//Before unmount it cleans up after itself by removing the dummy div   
componentWillUnmount() {
 document.body.removeChild(this.props.container); 
},

关于javascript - 你如何动态地将 React 组件插入 DOM(例如对话框)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38341129/

相关文章:

reactjs - 如何使用 Jest 和 react-testing-library 测试 Websocket 客户端

java - 使用 Bean 对象中的 JSON 构造数组

javascript - Vue-loader语法错误: Unexpected token { when importing a component from a js file

javascript - 浏览器何时执行缓存中的 JavaScript?

javascript - useSelector() 显示了 promise ,而不是来自商店的更新值

javascript - ReactJS 和非分层组件

javascript - 如何通过 AJAX/JQuery 在 Joomla 中验证用户

javascript - 我使用 javascript 设置字段值,onchange 未触发。替代解决方案?

javascript - Redux 状态正在更改,但使用 mapStateToProps 时 Prop 未定义

javascript - 如何使用 blueprintjs/table 渲染表格