当前位置: 首页 > 知识库问答 >
问题:

react.js-在重新呈现时更新收音机或检查输入

张卓
2023-03-14

我已经开始在React中编写一个简单的UI,在ajax调用后重新呈现输入字段对所有组件(text、select)都能正常工作,除了单选组和复选框。

代码如下:

//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元素和值都设置正确,唯一没有发生的事情是它在视觉上被反映出来。怀疑这可能是一般的Browser/JS问题,而不是具体的反应?

共有1个答案

虞滨海
2023-03-14

在父级上更改了“值”道具后,我一辈子都不能在重新呈现时正确地选中复选框或无线电组

这是因为getInitialState只在第一次呈现时调用。这就是为什么你应该避免传递初始状态作为道具。这是我关于同一主题的一个答案。

如果希望将来的呈现反映传入的新道具,请不要在状态中存储它们的值。

不可控组件将自行工作。它们存储状态,当您更改它们时,它们能够在没有父母干预的情况下重新生成。uncontrollable组件的将来重发器不会对它们的状态产生太大影响。

您的无线电充当不可控组件。这就是它不响应prop更改的原因。

 类似资料:
  • 我不知道为什么这不起作用 单击该按钮显然会更改道具,但旧的仍在输入中!那么什么给了?我做错了什么?这是虫子吗?有变通办法吗?

  • 问题内容: 我有一段代码 单击“ Hi”消息时,仅组件会继续重新渲染,而组件不会重新渲染。 为什么在状态更改时不重新渲染组件? 我想说,由于它是组件的一个属性而不会发生,但是仍然会被JSX中的组件评估,所以不确定。 完整示例https://codesandbox.io/s/529lq0rv2n(检查控制台日志) 问题答案: 这个问题已经很老了,但是由于您似乎没有得到满意的答案,因此我也会尝试一下。

  • 我正在学习React钩子,这意味着我将不得不从类转移到函数组件。以前,在类中,我可以拥有与状态无关的类变量,我可以在不重新呈现组件的情况下更新这些变量。现在我试图用钩子重新创建一个组件作为函数组件,我遇到了这样一个问题:我不能(就我所知)为该函数创建变量,因此存储数据的唯一方法是通过钩子。然而,这意味着每当该状态更新时,我的组件将重新呈现。 我已经在下面的示例中说明了这一点,我试图将类组件重新创建

  • 问题内容: 我试图让fullCalendar反映通过AJAX对数据库所做的更改。问题是在成功进行AJAX调用后,它不会更新屏幕上的日历。 我使用了错误的方法?无需重新加载整个页面的最佳方法是什么?感谢您的输入! 问题答案: 有几种方法。一些不太优雅。 1.如果您使用FullCalendar捕获json事件: 做就是了: 如果希望外部方法获取事件,则可以执行。不优雅但是可以用

  • 我是一个初学者React开发人员,我对这个特定的代码片段有一个问题。 问题: 虽然我直接复制了虚拟数据的值并将其作为单独的子项呈现,但并不是所有的虚拟数据都被呈现 我特意选择使用useRef而不是useState,因为在用户添加或编辑他们想要的任何链接之后,我想将keyRef发送到NoSQL数据库;然而,当我使用useState()时,它给了我陈旧的状态问题,其中包含所有链接的数组没有不断更新。

  • 我猜这可能与从父级打开有关,但我有其他组件,它们内部的状态发生变化,所以我有点困惑,为什么这个组件不尊重它的新状态。 谢谢