Angular2 与 Redux - DOM 协调
Angular2 with Redux - DOM reconciling
我正在 Angular2 and Redux 开始一个新项目。
作为不可变对象,当状态改变时,我们创建一个新对象,Angular重新绘制所有DOM。
如果操作是由输入元素调度的,焦点将丢失。
我已经分叉了一个示例 plunk 来重现该行为:http://plnkr.co/yb53ij
在实际应用中,我使用了表单API中的“.debounceTime()”,但这对用户体验来说似乎不太好。有办法避免这种情况,或者我遗漏了什么?
reducer代码:
export const todos = (state = [{text: 'Edit my input...'}], {type, payload}) => {
switch(type){
case ADD_TODO: ...
case UPDATE_TODO: ...
case COMPLETE_TODO: ...
case DELETE_TODO: ...
case 'REPEAT_TODO':
// Creates new state:
return state.map(todo => {
return todo.id !== payload.todo.id ?
todo :
Object.assign({}, todo, {times: payload.times})
});
default:
return state;
}
谢谢!
为了解决这个问题,我们需要使用*ngFor
指令的trackBy功能。所以我们可以告诉 Angular 不再渲染 DOM。
对于像我这样不知情的开发人员来说,这可能是一个性能陷阱! =P
@Component({
selector: 'todo-list',
template: `
<div>
<todo-list-item
*ngFor="#todo of todos; trackBy:custom"
...
></todo-list-item>
</div>
`,
directives: [TodoListItem]
})
export class TodoList {
...
custom(index,item){
return index;
}
}
这是工作的 plunker 演示:http://plnkr.co/1ffRPD6F1vHw0EmHh5er
我正在 Angular2 and Redux 开始一个新项目。
作为不可变对象,当状态改变时,我们创建一个新对象,Angular重新绘制所有DOM。
如果操作是由输入元素调度的,焦点将丢失。
我已经分叉了一个示例 plunk 来重现该行为:http://plnkr.co/yb53ij
在实际应用中,我使用了表单API中的“.debounceTime()”,但这对用户体验来说似乎不太好。有办法避免这种情况,或者我遗漏了什么?
reducer代码:
export const todos = (state = [{text: 'Edit my input...'}], {type, payload}) => {
switch(type){
case ADD_TODO: ...
case UPDATE_TODO: ...
case COMPLETE_TODO: ...
case DELETE_TODO: ...
case 'REPEAT_TODO':
// Creates new state:
return state.map(todo => {
return todo.id !== payload.todo.id ?
todo :
Object.assign({}, todo, {times: payload.times})
});
default:
return state;
}
谢谢!
为了解决这个问题,我们需要使用*ngFor
指令的trackBy功能。所以我们可以告诉 Angular 不再渲染 DOM。
对于像我这样不知情的开发人员来说,这可能是一个性能陷阱! =P
@Component({
selector: 'todo-list',
template: `
<div>
<todo-list-item
*ngFor="#todo of todos; trackBy:custom"
...
></todo-list-item>
</div>
`,
directives: [TodoListItem]
})
export class TodoList {
...
custom(index,item){
return index;
}
}
这是工作的 plunker 演示:http://plnkr.co/1ffRPD6F1vHw0EmHh5er