在React+Redux.js应用程序中,在Provider组件之外操作DOM元素的正确方法是什么
What is a proper way to manipulate DOM elements outside of Provider component in React + Redux.js app?
我正在创建一个React+Redux原型应用程序,我面临着一种情况,我想在Provider组件之外操作DOM。
我的React+Reux应用程序中有一个根组件:
class App extends Component {
render() {
return (
<div>
<Provider store={store}>
<Main />
</Provider>
<DebugPanel top right bottom>
<DevTools store={store} monitor={LogMonitor} />
</DebugPanel>
</div>
)
}
};
我在Main里面有一个按钮,我想用它来隐藏DebugPanel。出于这个原因,我想操作DebugPanel组件类,或者它上面的任何元素
这就引出了以下问题:
- 如何操作DebugPanel类名
- 如何在Provider组件之外操作DOM元素,例如body或html标记
- 商店状态的更改只能在提供者内部听到吗?还是我误解了
- 所有这些都可以通过一点点jQuery来解决。我可以把它放进商店,但这是一个有效的解决方案吗
- 什么是"纯Redux"方法
如果你想看一下代码,可以在我的git上找到:https://github.com/JaakkoKarhu/redux-react-blockgenerator
很抱歉,如果代码有点乱,我现在可能会在那里推很多废话。
我希望这个问题不要太宽泛,我正在寻找一种"最佳实践"类型的方法。
编辑:
编辑了整个问题以更好地描述让我困惑的地方。
首先:看起来您的代码就是React.render()函数。最佳实践是只调用此函数一次,以装载您的react代码。因此,首先:将初始渲染更改为:
React.render(
<Main/>,
document.getElementById('main')
);
把所有其他的东西放在一个完全反应的组件里。
至于你真正的问题:直接方法:
- 将类名置于根组件的状态
- 在根组件中添加一个更新状态的函数
- 将此函数作为道具传递给组件
当点击应用程序组件中的按钮时,根状态发生变化,DevTools将用新的类重新呈现。
您的根组件代码将包括:
getInitialState() {
return { devToolsClassName : 'dev-hidden' };
}
onClickInApp() {
this.setState({ devToolsClassName : 'dev-visible' });
}
main中的渲染函数将包括以下更改:
...
<App clickHandler={this.onClickInApp}/>
...
<DevTools className={this.state.devToolsClassName} store={store} monitor={LogMonitor} />
在你的内部,你会有一个功能(绑定到按钮点击),比如:
_onClick() {
this.props.onClickInApp()
}
这是可行的,但child在parent内部调用函数的部分可以说是一个反模式(尽管对此众说纷纭)。
因此,替代方案:纯通量方法:
- 在存储中放入一个
showDevTools
布尔值 - 每次更改存储时,让根组件从存储中获取它
- 这也会触发重新渲染
相关文章:
- 在单击任何位置时隐藏元素,而不检查每次DOM单击
- 是否有任何snippet或jQuery插件可以列出easylist.txt模式匹配的DOM中的所有元素
- 在不使用JQuery的情况下隐藏DOM中的选定元素
- 如何在DOM元素上按类型构建此函数
- DOM元素和angular元素之间的主要区别是什么
- 当带有渲染器的DOM元素不在屏幕顶部时,移动了场景的坐标
- 如何使用JavaScript在没有html dom的情况下隐藏html元素
- 使用jquery创建dom元素会导致ie9出现拒绝访问错误
- 通过AJAX侦听向DOM添加某些元素
- 如何在使用Ractive.extend()时引用DOM元素
- 在d3中向DOM元素添加了图像,但现在它赢得了't过渡
- Selenium无法在浏览器DOM中定位元素
- 如何'剪切'DOM元素并将其显示在其他位置
- 转换<a>使用jQuery将文本字符串转换为dom元素
- 从dom中删除任何元素后,Touchmove事件停止触发
- d3在数据更新时错误地附加了dom元素
- 访问VueJS中的DOM元素
- 在Meteor中如何查找DOM元素(渲染后)
- 找到元素DOM的根节点(阴影或光)的最佳方法是什么?
- 在querySelector:如何获得第一个和最后一个元素?dom中使用的遍历顺序