该useEffect阵营钩将运行在功能上传递的每一个变化.这可以进行优化,只有在所需的属性发生变化时才能调用它.
如果我想调用初始化函数componentDidMount
而不是在更改时再调用它会怎么样?假设我想加载一个实体,但加载函数不需要组件中的任何数据.我们怎么能用useEffect
钩子做这个?
class MyComponent extends React.PureComponent {
componentDidMount() {
loadDataOnlyOnce();
}
render() { ... }
}
Run Code Online (Sandbox Code Playgroud)
使用钩子,这可能是这样的:
function MyComponent() {
useEffect(() => {
loadDataOnlyOnce(); // this will fire on every change :(
}, [...???]);
return (...);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试创建 SwiftUI 支持的自定义属性包装器,这意味着对相应属性值的更改会导致 SwiftUI 视图的更新。这是我所拥有的简化版本:
@propertyWrapper
public struct Foo: DynamicProperty {
@ObservedObject var observed: SomeObservedObject
public var wrappedValue: [SomeValue] {
return observed.value
}
}
Run Code Online (Sandbox Code Playgroud)
我看到即使 myObservedObject
包含在我的自定义属性包装器中,SwiftUI 仍然会捕获更改,SomeObservedObject
只要:
DynamicProperty
不幸的是,文档很少,我很难判断这是否仅适用于当前的 SwiftUI 实现。
DynamicProperty
(在 Xcode 中,而不是在线)的文档似乎表明这样的属性是从外部更改导致视图重绘的属性,但是无法保证当您使自己的类型符合此协议时会发生什么。
我可以期待这在未来的 SwiftUI 版本中继续工作吗?
我正在阅读Redux的文档并且被困在了reselect
.下面的代码创建了一个选择器和文件说,如果我们想用它两个VisibleTodoList
部件,那么它不会工作正常.
import { createSelector } from 'reselect'
const getVisibilityFilter = (state, props) => state.todoLists[props.listId].visibilityFilter
const getTodos = (state, props) => state.todoLists[props.listId].todos
const getVisibleTodos = createSelector([getVisibilityFilter, getTodos], (visibilityFilter, todos) => {
switch (visibilityFilter) {
case 'SHOW_COMPLETED':
return todos.filter(todo => todo.completed)
case 'SHOW_ACTIVE':
return todos.filter(todo => !todo.completed)
default:
return todos
}
})
export default getVisibleTodos
Run Code Online (Sandbox Code Playgroud)
将getVisibleTodos选择器与visibleTodoList容器的多个实例一起使用将无法正确地进行memoize
const mapStateToProps = (state, props) => {
return {
// WARNING: THE FOLLOWING SELECTOR DOES NOT CORRECTLY MEMOIZE …
Run Code Online (Sandbox Code Playgroud) 我在F#中有一个序列:
let n = 2
let seq1 = {
yield "a"
yield "b"
yield "c"
}
Run Code Online (Sandbox Code Playgroud)
我想打印序列中的每个项目n次.我可以这样做:
let printx line t =
for i = 1 to t do
printfn "%s" line
seq1 |> Seq.iter (fun i -> printx i n)
Run Code Online (Sandbox Code Playgroud)
输出为:
a
a
b
b
c
c
我认为这不是最好的解决方案.如何复制序列中的项目?
javascript ×2
f# ×1
react-hooks ×1
react-redux ×1
reactjs ×1
redux ×1
reselect ×1
seq ×1
swift ×1
swiftui ×1