You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
109 lines
2.9 KiB
109 lines
2.9 KiB
10 years ago
|
/**
|
||
|
* Copyright 2013-2015, Facebook, Inc.
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* This source code is licensed under the BSD-style license found in the
|
||
|
* LICENSE file in the root directory of this source tree. An additional grant
|
||
|
* of patent rights can be found in the PATENTS file in the same directory.
|
||
|
*
|
||
|
* @providesModule ReactPropTransferer
|
||
|
*/
|
||
|
|
||
|
'use strict';
|
||
|
|
||
|
var assign = require("./Object.assign");
|
||
|
var emptyFunction = require("./emptyFunction");
|
||
|
var joinClasses = require("./joinClasses");
|
||
|
|
||
|
/**
|
||
|
* Creates a transfer strategy that will merge prop values using the supplied
|
||
|
* `mergeStrategy`. If a prop was previously unset, this just sets it.
|
||
|
*
|
||
|
* @param {function} mergeStrategy
|
||
|
* @return {function}
|
||
|
*/
|
||
|
function createTransferStrategy(mergeStrategy) {
|
||
|
return function(props, key, value) {
|
||
|
if (!props.hasOwnProperty(key)) {
|
||
|
props[key] = value;
|
||
|
} else {
|
||
|
props[key] = mergeStrategy(props[key], value);
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
|
||
|
var transferStrategyMerge = createTransferStrategy(function(a, b) {
|
||
|
// `merge` overrides the first object's (`props[key]` above) keys using the
|
||
|
// second object's (`value`) keys. An object's style's existing `propA` would
|
||
|
// get overridden. Flip the order here.
|
||
|
return assign({}, b, a);
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* Transfer strategies dictate how props are transferred by `transferPropsTo`.
|
||
|
* NOTE: if you add any more exceptions to this list you should be sure to
|
||
|
* update `cloneWithProps()` accordingly.
|
||
|
*/
|
||
|
var TransferStrategies = {
|
||
|
/**
|
||
|
* Never transfer `children`.
|
||
|
*/
|
||
|
children: emptyFunction,
|
||
|
/**
|
||
|
* Transfer the `className` prop by merging them.
|
||
|
*/
|
||
|
className: createTransferStrategy(joinClasses),
|
||
|
/**
|
||
|
* Transfer the `style` prop (which is an object) by merging them.
|
||
|
*/
|
||
|
style: transferStrategyMerge
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Mutates the first argument by transferring the properties from the second
|
||
|
* argument.
|
||
|
*
|
||
|
* @param {object} props
|
||
|
* @param {object} newProps
|
||
|
* @return {object}
|
||
|
*/
|
||
|
function transferInto(props, newProps) {
|
||
|
for (var thisKey in newProps) {
|
||
|
if (!newProps.hasOwnProperty(thisKey)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
var transferStrategy = TransferStrategies[thisKey];
|
||
|
|
||
|
if (transferStrategy && TransferStrategies.hasOwnProperty(thisKey)) {
|
||
|
transferStrategy(props, thisKey, newProps[thisKey]);
|
||
|
} else if (!props.hasOwnProperty(thisKey)) {
|
||
|
props[thisKey] = newProps[thisKey];
|
||
|
}
|
||
|
}
|
||
|
return props;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* ReactPropTransferer are capable of transferring props to another component
|
||
|
* using a `transferPropsTo` method.
|
||
|
*
|
||
|
* @class ReactPropTransferer
|
||
|
*/
|
||
|
var ReactPropTransferer = {
|
||
|
|
||
|
/**
|
||
|
* Merge two props objects using TransferStrategies.
|
||
|
*
|
||
|
* @param {object} oldProps original props (they take precedence)
|
||
|
* @param {object} newProps new props to merge in
|
||
|
* @return {object} a new object containing both sets of props merged.
|
||
|
*/
|
||
|
mergeProps: function(oldProps, newProps) {
|
||
|
return transferInto(assign({}, oldProps), newProps);
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
module.exports = ReactPropTransferer;
|