如何组织不修改状态的动作?
How to organize actions that don't modify state?
假设我有一个这样的 React 组件:
class App extends Component {
print = () => {
const { url } = this.props
const frame = document.createElement('iframe')
frame.addEventListener('load', () => {
const win = frame.contentWindow
win.focus()
win.print()
win.addEventListener('focus', () => document.body.removeChild(frame))
})
Object.assign(frame.style, {
visibility: 'hidden',
position: 'fixed',
right: 0,
bottom: 0
})
frame.src = url
document.body.appendChild(frame)
}
}
基本上,单击按钮会为用户调用浏览器中的打印功能。在这种情况下,我是否仍然将它变成像 DO_PRINT
这样的 redux 操作,它实际上对我的 redux 状态没有任何影响,还是我只是不去理会它?
对于您的特定示例,我会避免创建 Redux 操作,因为如果 DO_PRINT
仅调用 window.print()
.
,则不需要更新任何状态
事实上,假设您正在创建一个 "Print button" 组件,我会将其重新定义为哑组件。 (参见 differences between presentationl and container components。)
import React from ‘react’;
const PrintButton = () => {
const onClick = () => {
window.print();
};
return <button onClick={onClick}>Click Me</button>
};
export default PrintButton;
仅供参考,上面的代码可能不是为无状态组件声明事件处理程序的最有效方式,因为每次呈现组件时都可能调用该函数。可能有更好(更有效)的方法 (described in another SO question) 但这超出了这个问题。
假设我有一个这样的 React 组件:
class App extends Component {
print = () => {
const { url } = this.props
const frame = document.createElement('iframe')
frame.addEventListener('load', () => {
const win = frame.contentWindow
win.focus()
win.print()
win.addEventListener('focus', () => document.body.removeChild(frame))
})
Object.assign(frame.style, {
visibility: 'hidden',
position: 'fixed',
right: 0,
bottom: 0
})
frame.src = url
document.body.appendChild(frame)
}
}
基本上,单击按钮会为用户调用浏览器中的打印功能。在这种情况下,我是否仍然将它变成像 DO_PRINT
这样的 redux 操作,它实际上对我的 redux 状态没有任何影响,还是我只是不去理会它?
对于您的特定示例,我会避免创建 Redux 操作,因为如果 DO_PRINT
仅调用 window.print()
.
事实上,假设您正在创建一个 "Print button" 组件,我会将其重新定义为哑组件。 (参见 differences between presentationl and container components。)
import React from ‘react’;
const PrintButton = () => {
const onClick = () => {
window.print();
};
return <button onClick={onClick}>Click Me</button>
};
export default PrintButton;
仅供参考,上面的代码可能不是为无状态组件声明事件处理程序的最有效方式,因为每次呈现组件时都可能调用该函数。可能有更好(更有效)的方法 (described in another SO question) 但这超出了这个问题。