Недавно я получил запрос примерно такого содержания:
На определенной странице вверху находится элемент запроса, а внизу — список. В элементе запроса есть два раскрывающихся поля выбора, оба из которых являются условиями запроса. Эти два поля выбора имеют отношения «родитель-потомок». Когда я выбираю элемент в первом поле выбора, раскрывающиеся элементы второго поля выбора изменятся; когда я выбираю элемент во втором поле выбора, значение первого поля выбора необходимо заполнить обратно.
Наверное, это эффект,Описать это таким образом немного сложно. Давайте посмотрим на реальный Случай,Это сделает ситуацию намного понятнее.
Предположим, есть два раскрывающихся поля выбора: поле выбора 1 представляет компанию, а поле выбора 2 представляет продукт. Как показано ниже:
Реализованные функциональные требования следующие:
Описание этого случая,Добавить фотографии,Разве это не намного яснее? Давайте реализуем эту функцию вместе.
Сначала мы пишем макет страницы, который можно написать вручную или сгенерировать с помощью помощника кода Tencent Cloud AI.
Здесь я беру элемент ui в качестве примера и использую AI Assistant для его создания. Подсказка выглядит следующим образом:
Пожалуйста, помогите мне создать один element-ui Страница формы, на этой странице есть два поля выбора, а именно:
Выбрать boxel-выбрать Компания (Tencent, Baidu, Alibaba)
Выбрать boxel-выбрать Продукты (QQ, WeChat, DingTalk, Taobao, Baidu Netdisk, метод ввода Baidu)
Среди них QQ и WeChat — продукты Tencent, DingTalk и Taobao — продукты Alibaba, а Baidu Netdisk и Baidu Input Method — продукты Baidu.
У них есть филиалы, и мне нужно, чтобы вы помогли мне реализовать следующие функции:
1. По умолчанию щелкните поле выбора 1, чтобы просмотреть все параметры компании, и выберите поле 2, чтобы просмотреть все параметры продукта (без различия между компаниями).
2. После выбора любой компании (например, Tencent) в поле выбора 1, в поле выбора 2 появятся только варианты продуктов, относящиеся к этой компании (например, Tencent).
3. Если продукт (например, WeChat) выбран в поле выбора 2 вначале, то компания, соответствующая продукту (например, Tencent), будет выбрана по умолчанию в поле выбора 1.
4. Также имеется кнопка сброса. После нажатия кнопки сброса оба поля выбора вернутся в исходное состояние, то есть вы сможете просмотреть все параметры, щелкнув их по отдельности.
-----После выполнения вышеуказанных требований создайте его для меня. bootcdn версия элемента-ui HTML версия demo
Итак, мы получаем следующее содержимое файла:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Element UI страница формы</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
<div id="app">
<el-form ref="form" label-position="left" label-width="120px">
<el-form-item label="компания">
<el-select v-model="company" Placeholder="Пожалуйста, выберите компанию">
<el-option
v-for="item in companies"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="продукт">
<el-select v-model="product" Placeholder="Пожалуйста, выберите продукт">
<el-option
v-for="item in products"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="resetForm">перезагрузить</el-button>
</el-form-item>
</el-form>
</div>
<script src="https://unpkg.com/vue@2.6.12/dist/vue.js"></script>
<script src="https://unpkg.com/element-ui@2.15.7/lib/index.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
company: '',
product: '',
companies: [
{ label: «Тенсент», value: 'tencent' },
{ label: «Байду», value: 'baidu' },
{ label: 'Али', value: 'alibaba' }
],
products: [
{ label: 'QQ', value: 'qq', company: 'tencent' },
{ label: «Ви Чат», value: 'wechat', company: 'tencent' },
{ label: «Динг Ток», value: 'dingtalk', company: 'alibaba' },
{ label: «Таобао», value: 'taobao', company: 'alibaba' },
{ label: «Байду Нетдиск», value: 'baidunetdisk', company: 'baidu' },
{ label: «Метод ввода Baidu», value: 'baiduinput', company: 'baidu' }
]
};
},
watch: {
company(newValue) {
this.product = '';
if (newValue === 'tencent') {
this.products = [
{ label: 'QQ', value: 'qq', company: 'tencent' },
{ label: «Ви Чат», value: 'wechat', company: 'tencent' }
];
} else if (newValue === 'alibaba') {
this.products = [
{ label: «Динг Ток», value: 'dingtalk', company: 'alibaba' },
{ label: «Таобао», value: 'taobao', company: 'alibaba' }
];
} else if (newValue === 'baidu') {
this.products = [
{ label: «Байду Нетдиск», value: 'baidunetdisk', company: 'baidu' },
{ label: «Метод ввода Baidu», value: 'baiduinput', company: 'baidu' }
];
}
},
product(newValue) {
this.company = newValue.company;
}
},
methods: {
resetForm() {
this.company = '';
this.product = '';
}
}
});
</script>
</body>
</html>
Хоть AI-помощник и создал мне страницу, но cdn он не заменил, да и с привязкой все равно была проблема. Но это не беда, реализуем функциональные требования вручную.
Как вы можете заметить из приведенного выше кода, продукты как вариант для второго поля выбора,дополнительно представленоcompany
поля,Это поле очень критично,Когда вы выбираете определенный продукт,Вы можете сразу узнать, какой компании соответствует соответствующая компания. В ходе реального процесса развития бизнеса,Об этом необходимо сообщить команде внутренней разработки.,Запрос данных, возвращаемых другой стороной через интерфейс,включатьcompany
Этот предмет。
Если хорошенько подумать, то на самом деле варианты компании фильтровать не нужно, нужно фильтровать только продукты. Тогда идея становится очень ясной: как фильтровать продукты и как повторять компанию.
При фильтрации товаров у меня есть две идеи:
По сути, оба метода основаны на фильтрации, но идея 2 не требует подготовки дополнительной резервной переменной. Но в идее 2 следует отметить одну вещь: v-if и v-for нельзя смешивать. Здесь нужно добавить v-for во внешний шаблон, а затем добавить v-if внутрь.
Что касается эха выбора компании, вам нужно только добавить событие изменения в поле выбора продукта. После каждого изменения используйте метод find для запроса соответствующей компании на основе значения текущего продукта, а затем присвойте значение. к v-модели окна выбора компании. Просто отлично.
Сброс еще лучше. Просто используйте forEach, чтобы установить для отображения каждого элемента в продуктах значение true, и установите для v-mol двух полей выбора пустую строку.
Еще следует отметить, что каждый раз, когда вы выбираете компанию, вам нужно удалить последние выбранные продукты. Я обнаружил эту проблему только после того, как закончил писать.
Прилагается полный код ниже:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Element UI страница формы</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
</head>
<body>
<div id="app">
<el-form ref="form" label-position="left" label-width="120px">
<el-form-item label="компания">
<el-select v-model="company" Placeholder="Пожалуйста, выберите компанию" @change="handleChange1">
<el-option v-for="item in companies" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="продукт">
<el-select v-model="product" Placeholder="Пожалуйста, выберите продукт" @change="handleChange2">
<template v-for="item in products">
<el-option
v-if="item.display" :key="item.value" :label="item.label" :value="item.value"></el-option>
</template>
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="resetForm">перезагрузить</el-button>
</el-form-item>
</el-form>
</div>
<script src="https://unpkg.com/vue@2.6.12/dist/vue.js"></script>
<script src="https://unpkg.com/element-ui@2.15.7/lib/index.js"></script>
<script>
new Vue({
el: '#app',
data() {
return {
company: '',
product: '',
companies: [
{ label: «Тенсент», value: 'tencent' },
{ label: «Байду», value: 'baidu' },
{ label: 'Али', value: 'alibaba' }
],
products: [
{ label: 'QQ', value: 'qq', company: 'tencent' },
{ label: «Ви Чат», value: 'wechat', company: 'tencent' },
{ label: «Динг Ток», value: 'dingtalk', company: 'alibaba' },
{ label: «Таобао», value: 'taobao', company: 'alibaba' },
{ label: «Байду Нетдиск», value: 'baidunetdisk', company: 'baidu' },
{ label: «Метод ввода Baidu», value: 'baiduinput', company: 'baidu' }
]
};
},
created() {
this.products.forEach(item => item.display = true)
},
methods: {
// Выберите компанию
handleChange1(value) {
// Фильтруйте товары по компаниям, используя forEach фильтр
this.products.forEach(item => item.display = item.company == value)
// Сбросить продукт
this.product = '';
},
// Выберите продукт
handleChange2(value) {
// Найти выбранный элемент
const findProduct = this.products.find(item => item.value === value);
// Назначьте соответствующую компанию этого элемента компания (примечание: здесь необходимо добавить судебное решение, иначе оно будет неопределенным) Если значение будет получено снова, будет сообщено об ошибке)
if(findProduct){
this.company = findProduct.company;
}
},
resetForm() {
this.company = '';
this.product = '';
this.products.forEach(item => item.display = true)
}
}
});
</script>
</body>
</html>
Эффект следующий:
Таким образом, все необходимые функции будут реализованы, а пользовательский опыт станет намного лучше. Если вам нужно только выбрать продукты, вы можете попробовать каскадный селектор. Я напишу статью о каскадном селекторе в другой раз.
Даже перед лицом маленькой Случайности,Также могут быть некоторые детали, на которые необходимо обратить внимание при реализации. Не обращая внимания,Могут возникнуть различные проблемы. Эта статья основана на моих личных потребностях в реальных бизнес-сценариях.,Маленький Случай был задуман как симуляция. Я надеюсь, что этот рассказ о «Случае» поможет вам и вдохновит. Я надеюсь, что этот Случай также может вдохновить на новые мысли и дискуссии по аналогичным сценариям практического применения.