vue-questionnaire-create

0.2.2 • Public • Published

vue-questionnaire-create

管理端问卷创建组件(vue)

简介

用于vue管理端项目创建问卷的组件。支持单选题、多选题、文本题的创建。支持题目的拖拽排序。

快速开始

安装

npm install vue-questionnaire-create --save

使用Demo

1.使用组件内置操作按钮(提交 + 清空)

     <template>
         <v-questionnaire
             ref="questionnaire"
             :data="form.questions"
             :rules="questionnaireRules"
             :onSubmit="submitHandler"
         />
     </template>
    <script>
     import questionnaire from 'vue-questionnaire-create';
     export default {
            components: {
                'v-questionnaire': questionnaire
            },
            data() {
                form: {
                    questions: [{
                        type: 1,
                        is_deleted: false,
                        question: '你最喜欢的水果是?',
                        choices: [{
                            type: 1,
                            is_deleted: false,
                            description: '苹果'
                        }, {
                            type: 1,
                            is_deleted: false,
                            description: '樱桃'
                        }, {
                            type: 2,
                            is_deleted: false,
                            description: '其他'
                        }]
                    }, {
                        type: 2,
                        is_deleted: false,
                        question: '你最喜欢的城市是?',
                        max_answer: 2,
                        choices: [{
                            type: 1,
                            is_deleted: false,
                            description: '北京'
                        }, {
                            type: 1,
                            is_deleted: false,
                            description: '三亚'
                        }, {
                            type: 1,
                            is_deleted: false,
                            description: '西安'
                        }, {
                            type: 2,
                            is_deleted: false,
                            description: '其他'
                        }]
                    }, {
                        type: 3,
                        is_deleted: false,
                        question: '你觉得是什么限制了你的脚步?'
                    }]
                },
                questionnaireRules: {
                    radio: {
                        questionTextRange: [1, 100],
                        choiceNumRange: [2, 10],
                        choiceTextRange: [1, 100]
                    },
                    checkBox: {
                        questionTextRange: [1, 100],
                        choiceNumRange: [2, 10],
                        choiceTextRange: [1, 100]
                    },
                    text: {
                        questionTextRange: [1, 100]
                    }
                }
            },
            methods: {
                submitHandler(data) {
                    console.log('questionList:', data);
                }
            }
     }
    </script>

2.使用自定义操作按钮

```json
 <template>
         <v-questionnaire
             ref="questionnaire"
             :data="form.questions"
             :rules="questionnaireRules"
             :showOperations="false"
         />
         <button @click="submitHandler">提交问卷</button>
         <button @click="clearHandler">清空问卷</button>
     </template>
    <script>
     import questionnaire from 'vue-questionnaire-create';
     export default {
            components: {
                'v-questionnaire': questionnaire
            },
            data() {
                form: {
                    questions: [{
                        type: 1,
                        is_deleted: false,
                        question: '',
                        choices: [{
                            type: 1,
                            is_deleted: false,
                            description: ''
                        }, {
                            type: 1,
                            is_deleted: false,
                            description: ''
                        }, {
                            type: 2,
                            is_deleted: false,
                            description: ''
                        }]
                    }, {
                        type: 2,
                        is_deleted: false,
                        question: '',
                        max_answer: 2,
                        choices: [{
                            type: 1,
                            is_deleted: false,
                            description: ''
                        }, {
                            type: 1,
                            is_deleted: false,
                            description: ''
                        }, {
                            type: 1,
                            is_deleted: false,
                            description: '西'
                        }, {
                            type: 2,
                            is_deleted: false,
                            description: ''
                        }]
                    }, {
                        type: 3,
                        is_deleted: false,
                        question: ''
                    }]
                },
                questionnaireRules: {
                    radio: {
                        questionTextRange: [1, 100],
                        choiceNumRange: [2, 10],
                        choiceTextRange: [1, 100]
                    },
                    checkBox: {
                        questionTextRange: [1, 100],
                        choiceNumRange: [2, 10],
                        choiceTextRange: [1, 100]
                    },
                    text: {
                        questionTextRange: [1, 100]
                    }
                }
            },
            methods: {
                submitHandler() {
                    // 
                    const { isValid, errorMsg } = this.$refs.questionnaire.checkValid();
                    if (isValid) {
                        // 
                    } else {
                        // errorMsg
                    }
                },
                clearHandler() {
                    this.form.questions = [];
                }
            }
     }
    </script>

组件接收参数(props)

1. data:问题列表(可选)

类型: Array

数据Demo:

[{
    type: 1,
    is_deleted: false,
    question: '',
    choices: [{
        type: 1,
        is_deleted: false,
        description: ''
    }, {
        type: 1,
        is_deleted: false,
        description: ''
    }, {
        type: 2,
        is_deleted: false,
        description: ''
    }]
}, {
    type: 2,
    is_deleted: false,
    question: '',
    max_answer: 2,
    choices: [{
        type: 1,
        is_deleted: false,
        description: ''
    }, {
        type: 1,
        is_deleted: false,
        description: ''
    }, {
        type: 1,
        is_deleted: false,
        description: '西'
    }, {
        type: 2,
        is_deleted: false,
        description: ''
    }]
}, {
    type: 3,
    is_deleted: false,
    question: ''
}]
// 字段含义
type: 问题类型 —— 1:单选题,2:多选题,3:文本题
is_deleted:问题状态 —— true:已删除,false:未删除
question:问题描述 —— String
choices: 选项列表 —— Array(单选、多选题用)
max_answer:最多选项数 —— Number(多选题用)
 
 
// choices 具体选项字段含义
type: 选项类型 —— 1:普通选项,2:”其他“选项 // ”其他“选项不允许用户更改,并且保持为最后一条选项。
is_deleted:问题状态 —— true:已删除,false:未删除
description:选项描述 —— String
 
【注】
is_deleted 字段主要用于与后端交互,更新问题/选项是否删除的状态。双层数组嵌套,采用 is_deleted 字段同步问题是否删除的状态,便于后端操作。页面上只渲染未删除的问题。
 

2. rules:问题校验规则(可选)

类型: Object

数据Demo:

{
    radio: {
        questionTextRange: [1, 100],
        choiceNumRange: [2, 10],
        choiceTextRange: [1, 100]
    },
    checkBox: {
        questionTextRange: [1, 100],
        choiceNumRange: [2, 10],
        choiceTextRange: [1, 100]
    },
    text: {
        questionTextRange: [1, 100]
    }
}

默认规则:

    {
     radio: {
     questionTextRange: [1, Infinity],
     choiceNumRange: [1, Infinity],
     choiceTextRange: [1, Infinity]
     },
     checkBox: {
     questionTextRange: [1, Infinity],
     choiceNumRange: [1, Infinity],
     choiceTextRange: [1, Infinity]
     },
     text: {
     questionTextRange: [1, Infinity]
     }
    }
 
    // 字段含义
    radio:单选题校验规则
    checkBox:多选题校验规则
    text:文本题校验规则
    questionTextRange:问题描述字数限制 —— Array
    choiceNumRange:选项个数限制 —— Array
    choiceTextRange:选项描述字数限制 —— Array

3. showOperations:是否使用组件内置的操作(提交 + 清空)按钮(可选)

类型: Boolean

数据Demo:true / false

默认:true

4. onSubmit:组件内置提交按钮,提交事件监听函数(可选)

类型: Function

说明:点击组件内置提交按钮,传出编辑后的 data(问题列表) 数据

使用Demo:

<template>
	<v-questionnaire :onSubmit="submitHandler" />
</template>

<script>
	methods: {
		submitHandler(data) {
			console.log('questionList:', data);
		}
	}
</script>

Package Sidebar

Install

npm i vue-questionnaire-create

Weekly Downloads

2

Version

0.2.2

License

MIT

Unpacked Size

38.3 kB

Total Files

19

Last publish

Collaborators

  • z_listening