React.js - 更新无线电或检查重新渲染时的输入

时间:2015-07-30 17:05:14

标签: javascript reactjs

我已经开始在React中编写一个简单的UI,并在ajax调用在所有组件(text,select)上正常工作后重新渲染输入字段,除了无线电组和复选框。

对于我的生活,我无法在"值"之后的重新渲染中正确检查复选框或无线电组。道具已被父母改变。 我知道组件正在从控制台输出重新呈现,现在我也正在正确计算已检查/选中状态。然而,这永远不会反映在UI中,它仍处于初始渲染状态。

代码如下:

//Mixin used for all form inputs        
var InputField = {
        isValid : function(){
            var input = this.state.value;
            var valid = true;
            if(this.props.validations !== undefined){
                for(var i = 0; i < this.props.validations.length;i++){
                    if(valid){
                        valid = this.props.validations[i](input);
                    }
                }
            }

            this.setState({isValid: valid});
            return valid;
        },

        componentWillReceiveProps: function(newProps){
            this.setState({value: newProps.value});
        },

        getInitialState: function() {
          return {value: this.props.value, isValid: true};
        }
    };
    //the actual component:
    var RadioButtons = React.createClass({
        mixins: [InputField],
        handleChange: function(){
            var props = this.props;
            var selectedOpts = _.map($(React.findDOMNode(this.refs.radiobuttons)).find(':checked'), function(opt){ return parseInt(opt.value); });
            var values = _.map(selectedOpts, function(index){
                return props.options[index];
            });
            if(values.length > 0)
                this.setState({value: values[0]});
            else
                this.setState({value: null});
        },

        render: function(){
            var showProp = this.props.show;
            var i = 0;
            var self = this;
            var options =  _.map(self.props.options,function(opt){
                var selected = show(self.state.value,showProp) === show(opt,showProp);
                console.log(selected);
                var result = (<label className="radio">
                        <span className="checked"><input type="radio" name={self.props.name} value={i} checked={selected} onChange={self.handleChange}>{show(opt,showProp)}</input></span>
                    </label>);
                i = i + 1;
                return result;
            });

            return ( <FormField label={this.props.label} fieldClass="col-md-8" ref="radiobuttons" errorMessage={this.props.errorMessage} isValid={this.state.isValid}> 
            {options}
                </FormField> 
                   );
        }

    }); 

我对此感到有些困惑,并希望得到任何帮助..

修改 似乎每个DOM元素和值都设置正确,唯一没有发生的是它在视觉上反映出来。 怀疑这可能是一般的浏览器/ JS问题,而不是具体的React?

2 个答案:

答案 0 :(得分:1)

  

我不能为我的生活获得复选框或广播组   在&#34;值&#34;之后正确检查重新渲染道具已经   父母改变了

那是因为getInitialState仅为第一次渲染而调用。这就是为什么你应该避免将初始状态作为道具传递的原因。 Here's an answer of mine regarding the same topic

如果您希望将来的渲染能够反映传入的新道具,请不要将其值存储在状态中。

React具有ControllableUncontrollable组件的概念。

  • Controllable组件存储的状态非常少。他们几乎收到prop的所有内容,他们会公开eventHandlers,以便在&#34;状态&#34;时通知家长。更改,以便父级可以再次渲染它们。因为他们不会存储很多州,所以他们不能setState重新投降。父母必须这样做。

  • Uncontrollable组件可以自行运行。他们存储状态,当你改变它们时,他们能够在没有父母干预的情况下重新登记。未来uncontrollable组件的重新渲染不会对其状态产生太大影响。

您的Radio充当uncontrollable组件。这就是为什么它没有回应prop更改。

答案 1 :(得分:1)

事实证明,这不是React的问题,也不是上面的代码: 它似乎是 jquery.uniform.js ,它在页面上以某种方式干扰了正确显示检查和无线电盒更新。

讨厌的。