作者:李权威
对于精准的数据操作,从来没有一种方法像lens这样易用。例如对于immutable的数据修改。
const data = {
some: {
of: {
property: 1
}
}
};
在Redux中我们如果修改data.some.of.property的值需要写成下面的形式
const newData = {
...data,
some: {
...data.some,
of: {
...data.some.of,
property: newValue
}
}
};
const R = require('ramda');
const data = {
some: {
of: {
otherProperty: 2,
property: 1
}
}
};
const propertyLens = R.lensPath(['some', 'of', 'property']);
console.log(R.set(propertyLens, 3, data))
{ some: { of: { otherProperty: 2, property: 3 } } }
const propertyLens = R.lensPath(['some', 'of', 'property']);
const path = ['some', 'of', 'otherProperty'];
const getter = R.path(path);
const setter = R.assocPath(path);
const otherPropertyLens = R.lens(getter, setter);
可以看到lens实际上是一个getter,setter的封装。当我们使用`view(otherPropertyLens, data)`时实际上触发的是 getter(data). 写值同理.
R.view(otherProperty, data); // return 3
- 写值操作(W)
R.set(otherProperty, newValue, data);
例如
const R = require('ramda');
const data = {
a: 1,
b: 2
};
const aLens = R.lensProp('a');
const newData = R.set(aLens, 3, data);
console.log(data, newData);
输出
{ a: 1, b: 2 } { a: 3, b: 2 }
const transformer = addOne;
R.over(otherProperty, transformer, data);
这里传入的transformer接收一个原来的旧值,返回一个新值进行写入. R.over的返回值类似R.set, 一个写入后的data对象。
import Actions from './actions';
import R from 'ramda';
const UserListLens = R.propLens('list');
const initialState = {
list: [],
};
function userReducer(state, action) {
switch(action.type) {
case Actions.SET_USER:
return R.set(UserListLens, action.value, state);
case Actions.ADD_USER:
return R.over(UserListLens, R.append(action.value), state);
case Actions.DELETE_USER:
return R.over(UserListLens, R.without(action.value), state);
default:
return state;
}
}
网易云新用户大礼包:https://www.163yun.com/gift
本文来自网易实践者社区,经作者李权威授权发布。