Open SunXinFei opened 5 years ago
根据trello业务和数据接口,整理逻辑如下:
同一个看板的任何地方都可以获取标签列表,并进行增删改; 所以根据该业务逻辑,将看板的标签列表放入store中,方便进行增、删、改、查。 我们监听strore中标签列表的变化,如果产生了变化,通过前后新旧数据的数据结构对比,我们可以比较出标签列表的增、删、改,这三种状态,然后对应将卡片中的打上的标签,相应的删除和修改。 这里值得说一句就是,标签列表中的增删改会紧接着发送后台请求,将后台表关联关系解除,所以监听标签列表变化之后,对应卡片的标签的删改只是前端操作,无需任何后台请求。
/**
* 检测新旧数据的增删改
* @param {Array} oldArr
* @param {Array} newArr
* @returns {Object} {flag: String(eg:'same','delete','change','add'),
changeItem:Object(修改后的元素),
deleteItem:Object(被删除的元素)}
*/
export const checkAddDeleteChange = (oldArr, newArr) => {
let resultObj = {
flag: 'same'
}
if (oldArr.length === newArr.length) {//change
//外层循环最新的数组,将修改后的最新结果,查找出来
for (let j in newArr) {
let flag = false
for (let i in oldArr) {
if (isObjectValueEqual(oldArr[i],newArr[j])) {
flag = true;
break;
}
}
if (!flag) {
resultObj.flag = 'change';
resultObj.changeItem = newArr[j];
break;
}
}
} else if (oldArr.length > newArr.length) {//delete
resultObj.flag = 'delete'
//外层循环旧数组,找出被删除的元素
for (let i in oldArr) {
let flag = false
for (let j in newArr) {
if (oldArr[j] === newArr[i]) {
flag = true;
break;
}
}
if (!flag) {
resultObj.deleteItem = oldArr[i];
break;
}
}
} else if (oldArr.length < newArr.length) {//add
resultObj.flag = 'add'
}
return resultObj;
}
/**
* 检测两个对象是否相同
* @param {Object} a
* @param {Object} b
* @returns {Boolean}
*/
export const isObjectValueEqual = (a, b) => {
// Of course, we can do it use for in
// Create arrays of property names
var aProps = Object.getOwnPropertyNames(a);
var bProps = Object.getOwnPropertyNames(b);
// If number of properties is different,
// objects are not equivalent
if (aProps.length != bProps.length) {
return false;
}
for (var i = 0; i < aProps.length; i++) {
var propName = aProps[i];
// If values of same property are not equal,
// objects are not equivalent
if (a[propName] !== b[propName]) {
return false;
}
}
// If we made it this far, objects
// are considered equivalent
return true;
}
写瀑布流主要是跟后面的网格布局做对比,思路如下:
卡片拖拽顺序控制
先说下trello这种纵列卡片的拖拽布局,很简单,只需要卡片的相对位置顺序,加上css布局即可。 一般情况下,拖拽卡片改变卡片位置有一种泛泛的方式,那就是把最新的index全部交给后台保存,但是弊端很明显,影响数据库字段很多,在trello中,有一套单独的逻辑,来优化这方面的操作: