Skip to content

Commit

Permalink
Move null-input-value-prop warning into devtool, add stack trace
Browse files Browse the repository at this point in the history
  • Loading branch information
jimfb authored and jim committed Jun 14, 2016
1 parent 6e8c2fb commit deb4728
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 54 deletions.
17 changes: 0 additions & 17 deletions src/renderers/dom/client/wrappers/ReactDOMInput.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ var warning = require('warning');

var didWarnValueLink = false;
var didWarnCheckedLink = false;
var didWarnValueNull = false;
var didWarnValueDefaultValue = false;
var didWarnCheckedDefaultChecked = false;
var didWarnControlledToUncontrolled = false;
Expand All @@ -35,19 +34,6 @@ function forceUpdateIfMounted() {
}
}

function warnIfValueIsNull(props) {
if (props != null && props.value === null && !didWarnValueNull) {
warning(
false,
'`value` prop on `input` should not be null. ' +
'Consider using the empty string to clear the component or `undefined` ' +
'for uncontrolled components.'
);

didWarnValueNull = true;
}
}

function isControlled(props) {
var usesChecked = props.type === 'checkbox' || props.type === 'radio';
return usesChecked ? props.checked !== undefined : props.value !== undefined;
Expand Down Expand Up @@ -149,7 +135,6 @@ var ReactDOMInput = {
);
didWarnValueDefaultValue = true;
}
warnIfValueIsNull(props);
}

var defaultValue = props.defaultValue;
Expand All @@ -169,8 +154,6 @@ var ReactDOMInput = {
var props = inst._currentElement.props;

if (__DEV__) {
warnIfValueIsNull(props);

var controlled = isControlled(props);
var owner = inst._currentElement._owner;

Expand Down
18 changes: 0 additions & 18 deletions src/renderers/dom/client/wrappers/ReactDOMSelect.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ var ReactUpdates = require('ReactUpdates');
var warning = require('warning');

var didWarnValueLink = false;
var didWarnValueNull = false;
var didWarnValueDefaultValue = false;

function updateOptionsIfPendingUpdateAndMounted() {
Expand All @@ -45,19 +44,6 @@ function getDeclarationErrorAddendum(owner) {
return '';
}

function warnIfValueIsNull(props) {
if (props != null && props.value === null && !didWarnValueNull) {
warning(
false,
'`value` prop on `select` should not be null. ' +
'Consider using the empty string to clear the component or `undefined` ' +
'for uncontrolled components.'
);

didWarnValueNull = true;
}
}

var valuePropNames = ['value', 'defaultValue'];

/**
Expand Down Expand Up @@ -168,7 +154,6 @@ var ReactDOMSelect = {
mountWrapper: function(inst, props) {
if (__DEV__) {
checkSelectPropTypes(inst, props);
warnIfValueIsNull(props);
}

var value = LinkedValueUtils.getValue(props);
Expand Down Expand Up @@ -205,9 +190,6 @@ var ReactDOMSelect = {

postUpdateWrapper: function(inst) {
var props = inst._currentElement.props;
if (__DEV__) {
warnIfValueIsNull(props);
}

// After the initial mount, we control selected-ness manually so don't pass
// this value down
Expand Down
19 changes: 0 additions & 19 deletions src/renderers/dom/client/wrappers/ReactDOMTextarea.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ var invariant = require('invariant');
var warning = require('warning');

var didWarnValueLink = false;
var didWarnValueNull = false;
var didWarnValDefaultVal = false;

function forceUpdateIfMounted() {
Expand All @@ -30,19 +29,6 @@ function forceUpdateIfMounted() {
}
}

function warnIfValueIsNull(props) {
if (props != null && props.value === null && !didWarnValueNull) {
warning(
false,
'`value` prop on `textarea` should not be null. ' +
'Consider using the empty string to clear the component or `undefined` ' +
'for uncontrolled components.'
);

didWarnValueNull = true;
}
}

/**
* Implements a <textarea> host component that allows setting `value`, and
* `defaultValue`. This differs from the traditional DOM API because value is
Expand Down Expand Up @@ -109,7 +95,6 @@ var ReactDOMTextarea = {
);
didWarnValDefaultVal = true;
}
warnIfValueIsNull(props);
}


Expand Down Expand Up @@ -159,10 +144,6 @@ var ReactDOMTextarea = {
updateWrapper: function(inst) {
var props = inst._currentElement.props;

if (__DEV__) {
warnIfValueIsNull(props);
}

var node = ReactDOMComponentTree.getNodeFromInstance(inst);
var value = LinkedValueUtils.getValue(props);
if (value != null) {
Expand Down
2 changes: 2 additions & 0 deletions src/renderers/dom/shared/ReactDOMDebugTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

'use strict';

var ReactDOMNullInputValuePropDevtool = require('ReactDOMNullInputValuePropDevtool');
var ReactDOMUnknownPropertyDevtool = require('ReactDOMUnknownPropertyDevtool');
var ReactDebugTool = require('ReactDebugTool');

Expand Down Expand Up @@ -68,5 +69,6 @@ var ReactDOMDebugTool = {
};

ReactDOMDebugTool.addDevtool(ReactDOMUnknownPropertyDevtool);
ReactDOMDebugTool.addDevtool(ReactDOMNullInputValuePropDevtool);

module.exports = ReactDOMDebugTool;
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/**
* Copyright 2013-present, 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 ReactDOMNullInputValuePropDevtool
*/

'use strict';

var ReactComponentTreeDevtool = require('ReactComponentTreeDevtool');

var warning = require('warning');

var didWarnValueNull = false;

function handleElement(debugID, element) {
if (element == null) {
return;
}
if (element.type !== 'input' && element.type !== 'textarea' && element.type !== 'select') {
return;
}
if (element.props != null && element.props.value === null && !didWarnValueNull) {
warning(
false,
'`value` prop on `%s` should not be null. ' +
'Consider using the empty string to clear the component or `undefined` ' +
'for uncontrolled components.%s',
element.type,
ReactComponentTreeDevtool.getStackAddendumByID(debugID)
);

didWarnValueNull = true;
}
}

var ReactDOMUnknownPropertyDevtool = {
onBeforeMountComponent(debugID, element) {
handleElement(debugID, element);
},
onBeforeUpdateComponent(debugID, element) {
handleElement(debugID, element);
},
};

module.exports = ReactDOMUnknownPropertyDevtool;

0 comments on commit deb4728

Please sign in to comment.