多項選擇題組件--react

最近在一本react書上看到一個多項選擇題的react組件炎咖,做了一些改動。實現(xiàn)一個多項選擇題的組件很簡單隘擎,但是這里主要講了它的實現(xiàn)思路痢法。以下是實現(xiàn)效果:

1508762957.jpg

一個渲染選擇題的組件要滿足一下幾個條件:
1.接受一組選項作為輸入。
2.把選項渲染給用戶陵且。
3.只允許用戶選擇一個選項裁僧。
HTML提供了input(radio)單選輸入框。
組件的層級從上往下看是這樣的:
MultipleChoice(多個選擇項的選擇題) ->RadioInput(一個選項) -> Input(type="radio")
選擇題組件MultipleChoice應(yīng)該由一個個基本的選項組成(RadioInput)慕购,一個選項應(yīng)該有一個輸入單選框input構(gòu)成聊疲。

組裝HTML

首先將input(type="radio")組裝到AnswerRadioInput這個組件中,

var AnswerRadioInput = React.createClass({
  render: function(){
    return (
      <div className="checks">
              <label htmlFor={this.state.id}><input type="radio" />Label text</label>
       </div>
    );  
  }
});
添加動態(tài)屬性

1.需要添加value和name值沪悲,表示傳遞的值获洲;
2.文本,這個選項是什么內(nèi)容
3.可能需要id
如此殿如,可以把這些添加到PropTypes對象當(dāng)中:

propTypes: {
        id: React.PropTypes.string.isRequired,
        name:React.PropTypes.string.isRequired,
        label:React.PropTypes.string.isRequired,
        value:React.PropTypes.string.isRequired,
        checked:React.PropTypes.bool,
        onChange:React.PropTypes.func.isRequired
    }
數(shù)據(jù)傳入
getInitialState: function(){
        var id = this.props.id;
        return {
            checked: false,
            id: id,
            name:id
        };
    },
    handleChanged: function(e){
        var checked = e.target.checked;
        //to do what;
    },
    render: function(){
        return (
            <div className="checks">
                <label htmlFor={this.state.id}>
                    <input type="radio" 
                    name={this.props.name} 
                    id={this.props.id} 
                    value={this.props.value}
                    onChange={this.handleChanged}
                    />{this.props.label}</label>
            </div>
        );
    }
整合到父組件當(dāng)中

現(xiàn)在可以把這個組件整合到AnswerMultipleChoiceQuestion父組件中贡珊,這一層主要是渲染一列選項讓用戶從中選擇最爬。
1.需要傳入給這個單選題傳入name值
2.需要傳入給這個單選題傳入問題內(nèi)容
2.需要傳入每個選項label內(nèi)容
3.需要傳入每個選項的value值

var AnswerMultipleChoiceQuestion = React.createClass({
    propTypes: {
        value: React.PropTypes.string,
        choices: React.PropTypes.array.isRequired
    },
    getInitialState: function(){
        return {
            id : parseInt(Math.random()*100000,10)+'i',
            value: this.props.value
        };
    },
    handleChanged: function(e){
        // e.stopPropagation();
    },
    renderChoices: function(){
        return this.props.choices.map(function(choice,i){
            return <AnswerRadioInput key={i} id={'choice-'+i} name={this.props.value} label={choice} value={this.props.choiceValue[i]}  onChange={this.handleChanged}/>;
        }.bind(this));
    },
    render: function(){
        return (
            <div className="form-group">
                <label className="survey-item-label" htmlFor={this.state.id}>
                    {this.props.label}
                </label>
                <div className="survey-item-content">
                    {this.renderChoices()}
                </div>
            </div>
        );
    }
});

現(xiàn)在只需要把這個組件暴露出來

module.exports = AnswerMultipleChoiceQuestion;
應(yīng)用
ReactDOM.render(<AnswerMultipleChoiceQuestion value={'fruit'} label={'最喜歡的水果是哪一個'} choices={['a.蘋果','b.西瓜','d.香蕉','d.葡萄']}/>,document.getElementById('wrapper'));

這樣只能生產(chǎn)一個選擇題,如果想要生產(chǎn)多個選擇題飞崖,像開始圖片展示那樣烂叔,則可以再多生成一個父組件。將這個AnswerMultipleChoiceQuestion整合到這個父組件中固歪。
1.需要傳入每道選擇題的問題內(nèi)容label蒜鸡;
2.需要傳入每個選項的name值;
3.需要傳入每個選項的內(nèi)容label;
4.需要傳入每個選項的value值牢裳;
5.可以考慮傳入這些選擇題的標(biāo)題title;

var ReactDOM = require('react-dom');
var React = require('react');
var AnswerMultipleChoiceQuestion = require('./Choice.jsx');

var MoreChoicesQuestion = React.createClass({
    propTypes: {
        values: React.PropTypes.array.isRequired,
        title: React.PropTypes.string.isRequired,
        labelArray: React.PropTypes.array.isRequired,
        choiceArray: React.PropTypes.array.isRequired
    },
    renderMore: function(){
        return this.props.choiceArray.map(function(choices,i){
            return <AnswerMultipleChoiceQuestion key={'question'+i} value={this.props.values[i]} label={this.props.labelArray[i]} choiceValue={this.props.choicesValue[i]} choices={choices}/>;
        }.bind(this));
    },
    render: function(){
        return (
            <div className="question-wrapper">
                <h3>{this.props.title}</h3>
                <div className="questions">
                    {
                        this.renderMore()
                    }
                </div>
            </div>
        );
    }
});
ReactDOM.render(<MoreChoicesQuestion values={['fruit','country','subject']}  title={'個人喜好調(diào)查問卷'} labelArray={['1.以下最喜歡的水果是哪一個逢防?','2.以下最喜歡的國家是哪一個?','3.以下最喜歡的科目是哪一個?']} choiceArray={[['a.蘋果','b.西瓜','c.香蕉','d.葡萄'],['a.中國','b.法國','c.英國','d.美國'],['a.數(shù)學(xué)','b.英語','c.語文','d.物理']]} choicesValue={[['apple','watermelon','banana','grape'],['China','France','England','America'],['math','English','chinese','physics']]}/>,document.getElementById('wrapper'));

表達有點亂~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒲讯,一起剝皮案震驚了整個濱河市忘朝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌判帮,老刑警劉巖局嘁,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異晦墙,居然都是意外死亡悦昵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門晌畅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來但指,“玉大人,你說我怎么就攤上這事抗楔∑宓剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵连躏,是天一觀的道長剩岳。 經(jīng)常有香客問我,道長入热,這世上最難降的妖魔是什么卢肃? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮才顿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘尤蒿。我一直安慰自己郑气,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布腰池。 她就那樣靜靜地躺著尾组,像睡著了一般忙芒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讳侨,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天呵萨,我揣著相機與錄音,去河邊找鬼跨跨。 笑死潮峦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的勇婴。 我是一名探鬼主播忱嘹,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼耕渴!你這毒婦竟也來了拘悦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤橱脸,失蹤者是張志新(化名)和其女友劉穎础米,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體添诉,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡屁桑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吻商。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掏颊。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖艾帐,靈堂內(nèi)的尸體忽然破棺而出乌叶,到底是詐尸還是另有隱情,我是刑警寧澤柒爸,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布准浴,位于F島的核電站,受9級特大地震影響捎稚,放射性物質(zhì)發(fā)生泄漏乐横。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一今野、第九天 我趴在偏房一處隱蔽的房頂上張望葡公。 院中可真熱鬧,春花似錦条霜、人聲如沸催什。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒲凶。三九已至气筋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旋圆,已是汗流浹背宠默。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灵巧,地道東北人搀矫。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像孩等,于是被迫代替她去往敵國和親艾君。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容