react-bootstrap
Version:
Bootstrap 3 components build with React
80 lines (70 loc) • 2.1 kB
JavaScript
import ReactPropTransferer from './react-es6/lib/ReactPropTransferer';
export default = {
/**
* Modify each item in a React children array without
* unnecessarily allocating a new array.
*
* @param {array|object} children
* @param {function} modifier
* @returns {*}
*/
modifyChildren: function (children, modifier) {
if (children == null) {
return children;
}
return Array.isArray(children) ? children.map(modifier) : modifier(children, 0);
},
/**
* Filter each item in a React children array without
* unnecessarily allocating a new array.
*
* @param {array|object} children
* @param {function} filter
* @returns {*}
*/
filterChildren: function (children, filter) {
if (children == null) {
return children;
}
if (Array.isArray(children)) {
return children.filter(filter);
} else {
return filter(children, 0) ? children : null;
}
},
/**
* Safe chained function
*
* Will only create a new function if needed,
* otherwise will pass back existing functions or null.
*
* @param {function} one
* @param {function} two
* @returns {function|null}
*/
createChainedFunction: function (one, two) {
var hasOne = typeof one === 'function';
var hasTwo = typeof two === 'function';
if (!hasOne && !hasTwo) { return null; }
if (!hasOne) { return two; }
if (!hasTwo) { return one; }
return function chainedFunction() {
one.apply(this, arguments);
two.apply(this, arguments);
};
},
/**
* Sometimes you want to change the props of a child passed to you. Usually
* this is to add a CSS class.
*
* @param {object} child child component you'd like to clone
* @param {object} props props you'd like to modify. They will be merged
* as if you used `transferPropsTo()`.
* @return {object} a clone of child with props merged in.
*/
cloneWithProps: function (child, props) {
return child.constructor.ConvenienceConstructor(
ReactPropTransferer.mergeProps(child.props, props)
);
}
};