2017-02-21 44 views
0

動態更改自定義控件樣式動態更改自定義控件樣式

我正在嘗試使用反應將紅色邊框置於每個空的自定義字段周圍。數組this.state.Fields包含所有要檢查的控件。 我想檢查每個需要的控件,如果它的值沒有設置,請更改它的style屬性。由於性質不能改變,我試圖用state但問題是我需要爲每種控制一個單獨的vriable:

<Control ref="controlLabel" name="controlLabel" type="1" onComponentMounted={this.register} label="Control Label:" required="1" value={this.state.controlLabel} localChange={this.handleControlLabelChange} inputStyle={{border: this.state.errControlLabelStyle}} /> 

我想知道如果有一個更優雅的方式來做到這一點?這裏是我的代碼:

this.state.Fields.forEach((field) => { 
    if(field.props.required === "1"){ 
     var validField = (field.props.value != '' && field.props.value != undefined); 
     if(!validField){ 
       //set the field style dynamically    
     } 
} 
validForm=validForm && validField; 
}); 

回答

0

您可以在控制本身中添加驗證邏輯。

var Control = React.createClass({ 
 
\t isValid: function() { 
 
    \t if (!this.props.required) { 
 
    \t return true; 
 
    } 
 
    \t return this.props.value !== '' && this.props.value !== undefined; 
 
    }, 
 

 
    render: function() { 
 
    \t let value = this.props.value; 
 
    return <div className={this.isValid() ? 'item valid' : 'item invalid'}>{value}</div>; 
 
    } 
 
}); 
 

 
var App = React.createClass({ 
 
    render: function() { 
 
    return (
 
    \t <div className="container"> 
 
     \t {[ 
 
     { 
 
      required: true, 
 
      value: '' 
 
     }, 
 
     { 
 
      required: true, 
 
      value: 'abc' 
 
     }, 
 
     { 
 
      required: false, 
 
      value: '' 
 
     } 
 
     ].map((v, i) => <Control key={i} required={v.required} value={v.value} />)} 
 
     </div> 
 
    ); 
 
    } 
 
}); 
 

 
ReactDOM.render(
 
    <App />, 
 
    document.getElementById('container') 
 
);
.valid { 
 
    border-color: green; 
 
} 
 

 
.invalid { 
 
    border-color: red; 
 
} 
 
    
 
.item { 
 
    width: 200px; 
 
    height: 50px; 
 
    border-width: 1px; 
 
    border-style: solid; 
 
    margin: 1px; 
 
    display: flex; 
 
} 
 
    
 
.container { 
 
    display: flex; 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script> 
 

 
<div id="container"> 
 
    <!-- This element's contents will be replaced with your component. --> 
 
</div>

+0

聽起來不錯,我所要做的是激活代碼按鈕點擊,你的建議會令控制爲無效,開始與方式,不是嗎? – ElenaDBA

+0

現在是的。爲了擴展它,你可以在你的數據對象上添加屬性isValid,並在按鈕上點擊 – baalazamon

+0

來改變它,但是它不會導致我開始使用同樣的東西嗎?我將添加一個屬性到自定義控件,並且爲了從父對象中進行更改,我需要使用狀態,並且必須爲頁面上的每個子控件設置單獨的狀態。 – ElenaDBA