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.
108 lines
2.9 KiB
108 lines
2.9 KiB
/** |
|
* 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;
|
|
|