You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.3 KiB
Vue

<template>
<view class="subject-select-page">
<ch-nav-bar title="知识点选择" :height="66">
<block v-slot:right>
<button class="complete-btn" size="mini" type="warn" :disabled="!isComplete" @click="complete"></button>
</block>
</ch-nav-bar>
<uni-row :gutter="0" @click="itemChange">
<uni-col :span="5">
<scroll-view class="grade-list" scroll-y="true">
<view class="grade-item list-item" :class="{'selected': item.gradeid == selectIds[0]}" v-for="item in gradeList" :key="item.gradeid" data-type="grade" :data-item="item">
<text>{{ item.gradename }}</text>
</view>
</scroll-view>
</uni-col>
<uni-col :span="6">
<scroll-view class="subject-list" scroll-y="true">
<view class="subject-item list-item" :class="{'selected': item.subjectid == selectIds[1]}" v-for="item in subjectList" :key="item.subjectid" data-type="subject" :data-item="item">
<text>{{ item.subjectname }}</text>
</view>
</scroll-view>
</uni-col>
<uni-col :span="13">
<scroll-view class="press-list" scroll-y="true">
<view class="press-item list-item" v-if="selectIds[1]" :class="{'selected': item.knowledgeid == selectIds[2]}" v-for="item in knowledgeList" :key="item.knowledgeid" data-type="knowledge" :data-item="item">
<text>{{ item.knowledgename }}</text>
</view>
<view class="default-text" v-else></view>
</scroll-view>
</uni-col>
</uni-row>
</view>
</template>
<script setup>
import { onMounted, reactive, toRefs, watch } from "vue";
import { getGradeList, getSubjectList, getKnowledgeList } from '@/api/school.js'
const selectFunDict = {
'subject': subjectChange,
'grade': gradeChange,
'knowledge': knowledgeChange
}
const data = reactive({
subjectList: [],
gradeList: [],
knowledgeList: [],
selectIds: [null, null, null],
isComplete: false
})
const { subjectList, gradeList, knowledgeList, selectIds, isComplete } = toRefs(data);
onMounted(() => {
Promise.all([getGradeList(), getSubjectList()]).then(resArr => {
gradeList.value = resArr[0];
subjectList.value = resArr[1]
})
})
watch(selectIds.value, (newV) => {
isComplete.value = newV.every(item => !!item || item == 0)
})
function itemChange (e) {
console.log('target', e.target)
const target = e.target;
const itemType = target.dataset.type || false;
const item = target.dataset.item || {};
itemType
&&
selectFunDict[itemType]
&&
selectFunDict[itemType](item)
if (!itemType || itemType === 'knowledge' || selectIds.value.slice(0, 2).some(item => !item)) return;
const params = {
gradeid: selectIds.value[0],
subjectid: selectIds.value[1]
}
getKnowledgeList(params).then(list => {
selectIds.value[2] = null;
knowledgeList.value = list;
})
}
function complete () {
uni.navigateTo({
url: `/pages/questions/questions?gradeId=${selectIds.value[0]}&subjectId=${selectIds.value[1]}&knowledgeId=${selectIds.value[2]}`
})
}
function gradeChange (grade) {
selectIds.value[0] = grade.gradeid
console.log('选中年级:', grade)
}
function subjectChange (subject) {
selectIds.value[1] = subject.subjectid;
console.log('选中科目:', subject)
}
function knowledgeChange (knowledge) {
selectIds.value[2] = knowledge.knowledgeid
console.log('选中出版社:', knowledge)
}
</script>
<style lang="scss" scoped>
@import './subjectSelect.scss';
</style>