JavaScript数组可以像FIFO队列一样运作。
const fifo = [];
fifo.push(1)
fifo.push(2)
console.log(fifo.push(3)) // undefined
console.log(fifo) // [1, 2, 3]
const val = fifo.shift()
console.log(val, fifo) // 1, [2, 3]
然而,push、pop、unshift和shift都会改变数组。这里有一种不可变的方法。
function immutablePush(arr, newEntry){
return [ ...arr, newEntry ]
}
function immutableShift(arr){
return arr.slice(1)
}
const fifo = [];
immutablePush(fifo, 1)
immutablePush(fifo, 2)
immutablePush(fifo, 3)
const val = fifo[0]
immutalbeShift(fifo)
如果您想像在对象中一样查找数据,您将需要
规范化数据。
在大多数情况下,您可以简单地使用
findIndex。
const findByIdQueue(array, id) => {
const i = array.findIndex(item => item.id_queue === id);
return ~i ? undefined : array[i];
}
在React Redux中,我们希望将访问和更新代码分离。我们使用选择器进行访问:
const selectFirstItem = state => {
const { fifo = [] } = state || {};
return fifo[0];
}
const selectItemById = (state, ownProp) => {
const { fifo = [] } = state || {};
const { id } = ownProp || {};
return findByIdQueue(fifo, id);
}
const mapStateToProps = (state, ownProp) => ({
firstItem = selectFirstItem(state);
itemById = select(state, ownProp)
})
export default connect(mapStateToProps)(MyCoolControl)
我们会根据行动进行更新:
const addItem = item => ({type: 'ADD_ITEM', item})
const removeFirstItem = () => ({type: 'REMOVE_FIRST_ITEM'})
const fifoReducer = (prev = defaultValue, action = {}) => {
const { type, item} = action;
switch (type) {
case "ADD_ITEM":
return [...prev, item];
case "REMOVE_FIRST_ITEM":
return prev.slice(1);
default: {
return prev;
}
}
};