react 实现问卷调查(单选题目、多选题目)

问卷调查怎么写?

前台的逻辑部分也就是在——单选和多选的实现以及存储上面


第一步:首先了解数据的基本类型、格式——大致如下(两个单选题目,一个多选题目):

 state = {
        choose_data: [
            {
                title_num:'1',
                id: 1,
                key: '1',
                title: '【安全类】请选择您心目中的“职业形象达 人”',
                title_type: 1,
                choose_list: [
                    {
                        id: 1,
                        key: '1-1',
                        letter: 'A',
                        img: choose_pic,
                        content: '安全部-特勤-张XX',
                    },
                    {
                        id: 2,
                        key: '1-2',
                        letter: 'B',
                        img: choose_pic,
                        content: '安全部-特勤-赵XX',
                    }
                ]
            },
            {
                title_num:'2',
                id: 2,
                key: '2',
                title: '有安全意识的是',
                title_type: 1,
                choose_list: [
                    {
                        id: 1,
                        key: '1-1',
                        letter: 'A',
                        content: '我是选择一',
                    },
                    {
                        id: 2,
                        key: '1-2',
                        letter: 'B',
                        content: '我是选择2',
                    }
                ]
            },
            {
                title_num:'3',
                id: 3,
                key: '3',
                title: '是颜色的有',
                title_type: 2,
                choose_list: [
                    {
                        id: 1,
                        key: '1-1',
                        letter: 'A',
                        content: '我是选择一',
                    },
                    {
                        id: 2,
                        key: '1-2',
                        letter: 'B',
                        content: '我是选择2',
                    },
                    {
                        id: 3,
                        key: '1-3',
                        letter: 'C',
                        content: '我是选择2',
                    }
                ]
            }
        ],
        answer: [],  //存储选择的答案(以数组包裹对象的方式来存储)
    }

包括的内容:题目id(题目标题、单选还是多选、题号等),第二层是选项的内容(每个选项的id、内容等)

第二步 引入antd单选多选标签

import { Radio,Checkbox  } from 'antd';

该情景下的单选多选框略有不同,所以需要利用选框组的形式来实现(为了确保每个题目的答案选择不会跟其他题目冲突):
所以还需要声明选框组的标签

const RadioGroup = Radio.Group;
const CheckboxGroup = Checkbox.Group;

第三步 页面的呈现方式

 <ul className={styles.topic_list_box}>
    {
        data.map((item) => {
            return (
                <li key={item.id}>
                    <p><span className={styles.title_num}>{`${item.title_num}.`}</span>{item.title}<span className={styles.topic_type}>{item.title_type===1?'单选题':'多选题'}</span></p>
                    <ul className={styles.choose_list}>
                        {
                            item.title_type===1?
                            <RadioGroup name="radiogroup" onChange={this.change_radio.bind(this, item.id)}>
                                {
                                    item.choose_list.length > 0 ?
                                        item.choose_list.map((item1) => {
                                            return (
                                                <li key={item1.id}>
                                                    {item1.img ? <img src={item1.img} alt="choose_pic" /> : ''}
                                                    <div className={styles.content}>
                                                        <span>{`${item1.letter}.`}</span>
                                                        <Radio
                                                            value={item1.letter}
                                                        >{item1.content}</Radio>
                                                    </div>
                                                </li>
                                            )
                                        }) : ''
                                }
                            </RadioGroup>:
                            <CheckboxGroup onChange={this.change_radio.bind(this, item.id,'checkbox')}>
                                {
                                    item.choose_list.length > 0 ?
                                        item.choose_list.map((item1) => {
                                            return (
                                                <li key={item1.id}>
                                                    {item1.img ? <img src={item1.img} alt="choose_pic" /> : ''}
                                                    <div className={styles.content}>
                                                        <span>{`${item1.letter}.`}</span>
                                                        <Checkbox
                                                            value={item1.letter}
                                                        >{item1.content}</Checkbox>
                                                    </div>
                                                </li>
                                            )
                                        }) : ''
                                }
                            </CheckboxGroup>

                        }
                    </ul>
                </li>
            )
        })
    }
</ul>

基本逻辑:如果是单选题的话,按照单选的格式来渲染,否则按照复选的格式来渲染(都是一组的格式),因为这样才能保证每道题目都是独立的
事件:onChange()
因为单选和多选事件中的参数代表的是不同的意思,所以需要区分一下

//选择
    change_radio(title_id, e,str) {
        const answer_current = this.state.answer;                           //原本state数组中存储的数据
        const answer_new = { title: title_id, choose_id: e==='checkbox'?str:e.target.value}   //最新原则的题目以及对应的答案
        answer_current.map((item) => {
            if (item.title === title_id) {                                  //如果原来的数组中题号存在和最新的一样的,则要剔除
                answer_current.splice(answer_current.indexOf(item), 1)
            }
        })
        //把最新的答案拼接到原来的数组中
        this.setState({
            answer: this.state.answer.concat(answer_new)
        })
    }

事件逻辑:
state中answer代表的是现有的答案(即在事件中重新声明之后的answer_current ),变量answer_new 代表的是用户最新选择的题目以及对应的答案,也就是说需要把新的答案存储到answer中之外,还要判断answer中是否有同样的题目的答案,有的话则需要删除掉。
至于==answer_new ==
choose_id要根据e来判定是因为,单选事件和多选事件中的参数不一样,
如果是单选e代表的是事件对象,str是undefined,
如果是多选,e代表的是我们传递进去的参数‘checkbox’,str则代表我选中的答案,所以是这样一个格式

万般滋味,都是生活。公众号求关注哦!
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现三级下拉框多,可以使用 Ant Design(蚂蚁金服UI库)提供的 Cascader 组件,并将其 mode 属性设置为 multiple。 首先,需要准备好三级数据源,比如: ```javascript const options = [ { value: 'zhejiang', label: '浙江省', children: [ { value: 'hangzhou', label: '杭州市', children: [ { value: 'xihu', label: '西湖区', }, { value: 'xiacheng', label: '下城区', }, ], }, { value: 'ningbo', label: '宁波市', children: [ { value: 'haishu', label: '海曙区', }, { value: 'jiangdong', label: '江东区', }, ], }, ], }, { value: 'jiangsu', label: '江苏省', children: [ { value: 'nanjing', label: '南京市', children: [ { value: 'xuanwu', label: '玄武区', }, { value: 'jianye', label: '建邺区', }, ], }, { value: 'suzhou', label: '苏州市', children: [ { value: 'gusu', label: '姑苏区', }, { value: 'wujiang', label: '吴江区', }, ], }, ], }, ]; ``` 然后在组件中使用 Cascader 组件,并将 options 数据源传递给它,同时将 mode 属性设置为 multiple: ```javascript import { Cascader } from 'antd'; function onChange(value, selectedOptions) { console.log(value, selectedOptions); } function CascaderDemo() { return ( <Cascader options={options} onChange={onChange} mode="multiple" /> ); } export default CascaderDemo; ``` 这样,就可以实现三级下拉框多了。当用户择某个项时,onChange 回调函数会被触发,可以通过回调函数获取当前中的值和项。可以根据中的值,通过查询接口等方式加载下一级项,从而实现动态联动效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值