Draft.js v0.10 版本包含了一个管理 DraftEntity
API的改变。现在不再支持全局的 DraftEntity 模块,而是把 DraftEntity
实例迁移到了 ContentState
中。这意味着 DraftEntity
提供的方法也被迁移到了ContentState
中。
+
这个 api 的改进有很多好处,这些好处将在 v0.11 版本中获得:
- DraftEntiy 实例也是不可变的对象;
- DraftEntity 不会被全局访问到;
- 所有 entity 的改变会触发重新渲染。
快速预览
新建一个 Entity
旧的语法
const entityKey = Entity.create(urlType, 'IMMUTABLE', {src: urlValue});
新的语法
const contentStateWithEntity = contentState.createEntity(urlType, 'IMMUTABLE', {
src: urlValue,
});
const entityKey = contentStateWithEntity.getLastCreatedEntityKey();
获取一个 Entity
旧的语法
const entityInstance = Entity.get(entityKey);
// entityKey is a string key associated with that entity when it was created
新的语法
const entityInstance = contentState.getEntity(entityKey);
// entityKey is a string key associated with that entity when it was created
Decorator 中 strategy 函数的参数改变
旧的语法
const compositeDecorator = new CompositeDecorator([
{
strategy: (contentBlock, callback) =>
exampleFindTextRange(contentBlock, callback),
component: ExampleTokenComponent,
},
]);
新的语法
const compositeDecorator = new CompositeDecorator([
{
strategy: (contentBlock, callback, contentState) => (
contentBlock, callback, contentState
),
component: ExampleTokenComponent,
},
]);
注意 ExampleTokenComponent 会传入 contentState 作为prop。 为什么这样做呢?我们在 contentBlock 中查找指定的 entity 时需要 contentState,因为 entity 的 api 已经迁移到了 contentState 中:
const mutableEntityStrategy = function(contentBlock, callback, contentState) {
contentBlock.findEntityRanges(character => {
const entityKey = character.getEntity();
if (entityKey === null) {
return false;
}
// To look for certain types of entities,
// or entities with a certain mutability,
// you may need to get the entity from contentState.
// In this example we get only mutable entities.
return contentState.getEntity(entityKey).getMutability() === 'MUTABLE';
}, callback);
};
Decorator 中查找 Entities 的 Strategies
旧的语法
function findLinkEntities(contentBlock, callback) {
contentBlock.findEntityRanges(character => {
const entityKey = character.getEntity();
return entityKey !== null && Entity.get(entityKey).getType() === 'LINK';
}, callback);
}
新的语法
function findLinkEntities(contentBlock, callback, contentState) {
contentBlock.findEntityRanges(character => {
const entityKey = character.getEntity();
return (
entityKey !== null &&
contentState.getEntity(entityKey).getType() === 'LINK'
);
}, callback);
}
更多信息
更多信息可以查看 升级示例。