问卷页面(支持多选)

页面效果

功能实现

问题组件:

js:

Component({
    properties: {
        list: {
            //原问卷内容, 真正的问题个数是长度减1, 第一个是概述
            type: Array,
            value: [],
        },
        //问卷类型
        questionType: {
            type: String,
            value: '脾胃',
        },
    },
    data: {
        indigestion: [],
        qusetionData: [],
        originIndex: 0,
        isShow: false,
    },
    observers: {
        list: function (val) {
            if (val && val.length) {
                let questionType = this.properties.questionType;
                this.setData({
                    indigestion: val,
                    qusetionData:
                        questionType == '情志'
                            ? val.slice(0, 1)
                            : val.slice(1, 2),
                });
            }
        },
    },
    methods: {
        /**
         * 已选的问题不可重新选择
         */
        async choose(e) {
            let dataset = e.currentTarget.dataset,
                { indigestion, qusetionData } = {
                    ...this.data,
                };
            // index0 ==父级的index
            let { index0, index, type, number, originIndex, value } = {
                ...dataset,
            };

            indigestion.forEach((e, key) => {
                if (e.number == number) {
                    originIndex = key;
                }
            });
            console.log('originIndex', originIndex);
            // 选择
            if (type == 'more') {
                //多选题
                if (qusetionData[index0].choose[index].checked) {
                    qusetionData[index0].choose[index].checked = false;
                } else {
                    qusetionData[index0].choose[index].checked = true;
                }
            } else {
                //单选题
                let choose = qusetionData[index0].choose;
                choose.forEach((ele, i) => {
                    if (ele.checked) {
                        delete ele.checked;
                    } else {
                        ele.checked = i == index;
                    }
                });
                qusetionData[index0].choose = choose;
            }

            let tmp = qusetionData[index0].choose.filter(ele => ele.checked);
            let link = value.link;
            if (tmp.length) {
                if (type !== 'more') {
                    indigestion[originIndex].flag = true;
                }

                // 多选时的拼接
                let str = qusetionData[index0].choose
                    .map(ele => {
                        if (ele.checked) {
                            return ele.name;
                        }
                    })
                    .filter(ele => ele)
                    .join('、');
                let str1 = qusetionData[index0].choose
                    .map(ele => {
                        if (ele.checked) {
                            return ele.value;
                        }
                    })
                    .filter(ele => ele)
                    .join('、');
                qusetionData[index0].answer = str;
                qusetionData[index0].chooseValue = str1;

                if (type !== 'more') {
                    // 单选且没到展示数,添加下一题
                    if (link != '结束') {
                        qusetionData.push(indigestion[link - 1]);
                    } else {
                        if (value.tzName) {
                            qusetionData[index0].tzName = value.tzName;
                        }
                        // 答完题后的答案
                        this.handleEnd(indigestion);
                    }
                }
            } else {
                delete indigestion[originIndex].flag;
            }

            indigestion[originIndex] = qusetionData[index0];
            qusetionData = qusetionData.filter(ele => ele);

            this.scrollNext();
            this.setData({
                originIndex,
                qusetionData,
                indigestion,
            });
        },
        scrollNext() {
            const query = wx.createSelectorQuery().in(this);
            query
                .select('.container')
                .boundingClientRect(function (rect) {
                    wx.pageScrollTo({ scrollTop: rect.height });
                })
                .exec();
        },
        handleEnd(indigestion) {
            const tmp = indigestion.filter(ele => ele.chooseValue);
            const arr = [];
            tmp.forEach(ele => {
                let obj = {
                    chooseValue: ele.chooseValue,
                    answer: ele.answer,
                    label: ele.label,
                    number: ele.number,
                };
                if (ele.level) {
                    obj.level = ele.level;
                }
                if (ele.tzName) {
                    obj.tzName = ele.tzName;
                }
                if (ele.disease) {
                    obj.disease = ele.disease;
                }
                arr.push(obj);
            });
            this.arr = arr;
            this.setData({
                isShow: true,
            });
        },
        // 多选确认
        confirm() {
            const { indigestion, qusetionData } = this.data;
            const index = qusetionData.length - 1;
            const question = qusetionData[index];
            const tmp = question.choose.filter(ele => ele.checked);
            // 如果选择过
            if (tmp.length) {
                question.flag = true;
                const select = question.choose.find(item => item.checked);
                if (!select) return;
                const { link } = select;
                // 添加下一题
                if (link != '结束') {
                    qusetionData.push(indigestion[link - 1]);
                } else {
                    this.handleEnd(indigestion);
                }

                this.scrollNext();
                this.setData({
                    qusetionData,
                });
            }
        },
        handleToResult() { //获取选择结果
            this.triggerEvent('handleToResult', {
                answer: this.arr,
            });
        },
    },
    lifetimes: {
        attached() {},
    },
});

wxml

<!-- 当前该做哪道题,common-active给谁赋值 -->
<view class="container">
    <view
        class="common"
        wx:for="{
    
    { qusetionData }}"
        wx:for-index="index0"
        wx:key="index0"
    >
        <view class="left">
            <image
                src="https://laikangland-dev.oss-cn-beijing.aliyuncs.com/20221223155345H234.png"
                mode="scaleToFill"
            ></image>
            <view
                >{
    
    { item.label }}({
    
    {
                    item.type === 'more' ? '可多选' : '单选'
                }})</view
            >
        </view>
        <view class="right" wx:if="{
    
    { !item.flag }}">
            <view
                data-index0="{
    
    { index0 }}"
                data-index="{
    
    { index }}"
                data-number="{
    
    { item.number }}"
                data-value="{
    
    { value }}"
                data-type="{
    
    { item.type }}"
                class="question {
    
    { value.checked ? 'active' : '' }}"
                wx:for="{
    
    { item.choose }}"
                wx:for-item="value"
                wx:key="index"
                catchtap="choose"
            >
                <view>{
    
    { value.value }}. {
    
    { value.name }}</view>
                <view class="info" wx:if="{
    
    { value.info }}">{
    
    {
                    value.info
                }}</view>
            </view>
            <view
                class="confirm-btn"
                wx:if="{
    
    { item.type === 'more' }}"
                data-index0="{
    
    { index0 }}"
                data-number="{
    
    { item.number }}"
                catchtap="confirm"
                >确定</view
            >
        </view>
        <view wx:elif="{
    
    { item.answer }}" class="answer">
            <view>{
    
    { item.answer }}</view>
        </view>
    </view>

    <view class="box" wx:if="{
    
    { isShow }}">
        <view class="info">您的测评结果已出,点击查看专属报告</view>
        <view class="btn" catchtap="handleToResult">查看结果</view>
    </view>
</view>

wxss

.common {
  margin: 40rpx 0rpx;
}
.common .left {
  display: flex;
  align-items: center;
  margin-bottom: 40rpx;
}
.common .left image {
  width: 74rpx;
  height: 76rpx;
  margin-right: 16rpx;
  flex-shrink: 0;
}
.common .left view {
  color: #222222;
  font-size: 32rpx;
  line-height: 44rpx;
  padding: 16rpx 4rpx 20rpx 20rpx;
  background: #FFFFFF;
  border-radius: 12rpx 12rpx 12rpx 0rpx;
}
.common .right {
  background: #fff;
  padding: 32rpx 40rpx;
  box-sizing: border-box;
  border-radius: 24rpx;
  margin-bottom: 40rpx;
}
.common .right .question {
  color: #222222;
  font-size: 32rpx;
  line-height: 44rpx;
  box-sizing: border-box;
  padding: 18rpx 24rpx;
  margin-bottom: 20rpx;
  border-radius: 12rpx;
  background: #F8F8F8;
}
.common .right .question .info {
  color: #999;
  font-size: 28rpx;
}
.common .right .active {
  background: rgba(229, 160, 109, 0.14);
}
.common .right .question:last-child {
  margin-bottom: 0rpx;
}
.common .right .confirm-btn {
  width: 592rpx;
  height: 80rpx;
  background: linear-gradient(138deg, #FFA562 0%, #F6915A 100%);
  border-radius: 40rpx;
  font-size: 28rpx;
  line-height: 80rpx;
  text-align: center;
  color: #ffffff;
  margin: 12rpx auto 0;
}
.common .answer {
  display: flex;
  margin-bottom: 40rpx;
  justify-content: flex-end;
}
.common .answer view {
  color: #fff;
  width: fit-content;
  font-size: 32rpx;
  line-height: 44rpx;
  background: #E5A06D;
  border-radius: 12rpx 12rpx 0rpx 12rpx;
  padding: 16rpx 30rpx;
}
.common-active {
  opacity: 0;
}
.box {
  display: flex;
  background: #fff;
  align-items: center;
  flex-direction: column;
  justify-content: center;
  padding: 50rpx 0rpx;
}
.box .info {
  color: #222222;
  font-size: 32rpx;
  font-weight: bolder;
  line-height: 44rpx;
  margin-bottom: 52rpx;
}
.box .btn {
  text-align: center;
  width: 250rpx;
  height: 72rpx;
  color: #fff;
  font-size: 28rpx;
  line-height: 72rpx;
  background: linear-gradient(138deg, #FFA562 0%, #F6915A 100%);
  border-radius: 36rpx;
}
@keyframes fadenum {
  /*设置内容由显示变为隐藏*/
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

父组件调用

<question list="{
    
    { list }}" questionType="{
    
    {questionType}}"  bindhandleToResult="handleToResult"/>

//handleToResult:接收子组件的数据,可在js中处理

对应的数据格式

let indigestion = [
    {
        label: '以下问卷内容旨在为您提供日常健康生活方式建议,请勿用作医疗途径。如有身体不适请及时就医。请您回顾近三个月到半年的身体状况。您的填写内容仅用作问卷检测,隐私信息概不泄露,请放心作答。',
        choose:[{
            name:'我已知晓以上声明',
            value: 'A',
            link: 2
        }],
        number: 1
    },
    {
        type: 'more',  //设置type为more,当前为多选题,否则为单选
        label: '您近6个月(半年)会出现有以下症状表现的,请选择', //问题描述
        choose:[{
            name: '餐后饱胀', //选项名称
            info: '食物长时间存留在胃内引起的不适感', //选项描述
            value: 'A', //选项值
            link: 3 //当前题要跳转到的下一题题号
        },{
            name: '早饱感',
            info: '指进食少量食物即感觉胃部饱满,不能继续进餐',
            value: 'B',
            link: 3
        },{
            name: '上腹疼痛',
            info: '肚脐以上,胃部疼痛',
            value: 'C',
            link: 3
        },{
            name: '上腹烧灼感',
            info: '肚脐以上,胃腹部有灼热感',
            value: 'D',
            link: 3
        }],
        number: 2 //题号
    },
    {
        label: '近3个月,您以上症状表现发生的频率是',
        choose:[{
            name: '一个月偶发一两次',
            value: 'A',
            link: 4
        },{
            name: '一个月发生4次(平均1次/周)',
            value: 'B',
            link: 4
        },{
            name: '一个月发生4次以上',
            value: 'C',
            link: 4
        }],
        number: 3
    },
    {
        label: '您以上的症状是否会自行缓解或消失吗?',
        choose:[{
            name: '可以缓解或消失',
            value: 'A',
            link: 5
        },{
            name: '不能缓解或消失,但能忍受,不影响正常生活',
            value: 'B',
            link: 5
        },
        // {
        //     name: '不能缓解或消失,已影响正常生活',
        //     value: 'C',
        //     link: '结束'
        // }
        ],
        number: 4
    },
    {
        label: '您平时是否感觉压力很大,焦虑、紧张、抑郁?',
        choose:[{
            name: '没感觉到压力大、焦虑、紧张或抑郁',
            value: 'A',
            link: 6
        },{
            name: '感觉到,但可承受或可自行疏导',
            value: 'B',
            link: 6
        },{
            name: '感觉到,同时不可承受或自行疏导',
            value: 'C',
            link: 6
        }],
        number: 5
    },
    {
        label: '您有去医院进行过胃肠功能相关检查吗?',
        choose:[{
            name: '有',
            value: 'A',
            link: 7
        },{
            name: '没有',
            value: 'B',
            link: 7
        }],
        number: 6
    },
    {
        label: '您平时是否总有胃中空虚感,疲乏,大便糖稀,肠鸣?',
        choose:[{
            name: '是',
            value: 'A',
            link: 8
        },{
            name: '否',
            value: 'B',
            link: 13
        }],
        number: 7
    },
    {
        label: '您平时胃部是否热敷或者按揉觉得舒适,胃痛或腹胀遇冷加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: 9
        },{
            name: '否',
            value: 'B',
            link: 10
        }],
        number: 8
    },
    {
        label: '您平时是否口干、口苦、烦躁、小便黄',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '寒热错杂证'  //对应症状
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName: '脾胃虚寒证'
        }],
        number: 9
    },
    {
        label: '您平时是否经常反酸烧心或频繁打嗝?',
        choose:[{
            name: '是',
            value: 'A',
            link: 11
        },{
            name: '否',
            value: 'B',
            link: 12
        }],
        number: 10
    },
    {
        label: '您平时是否胁肋胀满,胃胀或腹痛情绪不佳时发作或加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '肝胃不和证'
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName: '脾虚气滞证'
        }],
        number: 11
    },
    {
        label: '您平时是否口苦、口干、烦躁、小便黄?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '脾胃湿热证'
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName: '脾虚气滞证'
        }],
        number: 12
    },
    {
        label: '您平时是否反酸烧心,频繁打嗝?',
        choose:[{
            name: '是',
            value: 'A',
            link: 14
        },{
            name: '否',
            value: 'B',
            link: 18
        }],
        number: 13
    },
    {
        label: '您平时是否胁肋胀满,胃胀或腹痛情绪不佳时发作或加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '肝胃不和证'
        },{
            name: '否',
            value: 'B',
            link: 15
        }],
        number: 14
    },
    {
        label: '您平时是否口苦、口干、烦躁、小便黄?',
        choose:[{
            name: '是',
            value: 'A',
            link: 16
        },{
            name: '否',
            value: 'B',
            link: 17
        }],
        number: 15
    },
    {
        label: '您平时胃部是否热敷或者按揉觉得舒适,胃痛或腹胀遇冷加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '寒热错杂证'
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName: '脾胃湿热证'
        }],
        number: 16
    },
    {
        label: '您平时胃部是否热敷或者按揉觉得舒适,胃痛或腹胀遇冷加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '脾胃虚寒证'
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName: '脾虚气滞证'
        }],
        number: 17
    },
    {
        label: '您平时是否口苦、口干、烦躁、小便黄?',
        choose:[{
            name: '是',
            value: 'A',
            link: 19
        },{
            name: '否',
            value: 'B',
            link: 20
        }],
        number: 18
    },
    {
        label: '您平时胃部是否热敷或者按揉觉得舒适,胃痛或腹胀遇冷加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName: '寒热错杂证'
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName: '脾胃湿热证'
        }],
        number: 19
    },
    {
        label: '您平时胃部是否热敷或者按揉觉得舒适,胃痛或腹胀遇冷加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName:'脾胃虚寒证'
        },{
            name: '否',
            value: 'B',
            link: 21
        }],
        number: 20
    },
    {
        label: '您平时是否胁肋胀满,胃胀或腹痛情绪不佳时发作或加重?',
        choose:[{
            name: '是',
            value: 'A',
            link: '结束',
            tzName:'肝胃不和证'
        },{
            name: '否',
            value: 'B',
            link: '结束',
            tzName:'脾胃虚弱证'
        }],
        number: 21
    }
]
export default indigestion

猜你喜欢

转载自blog.csdn.net/qq_41687299/article/details/128557214