当前位置: 首页 > wzjs >正文

端午节网站怎么做简述什么是网络营销

端午节网站怎么做,简述什么是网络营销,滕州市 网站建设公司,艾科斗少儿编程加盟最近遇到了在级联选择器上添加全选框的需求 ,但是项目使用的是Vue2 Element UI的架构,而我们都知道Element UI提供的级联选择器el-cascader是不支持全选框的,而我又没有在网上找到适合我项目的实现,索性自己实现一个组件&#xf…

最近遇到了在级联选择器上添加全选框的需求 ,但是项目使用的是Vue2 + Element UI的架构,而我们都知道Element UI提供的级联选择器el-cascader是不支持全选框的,而我又没有在网上找到适合我项目的实现,索性自己实现一个组件(源码附在文末,需要自取)

实现效果:

主要功能实现:

1. 全选按钮可选

通过属性 showAllNode 控制在多选模式下全选按钮的添加与否(注意,单选模式下没有全选按钮):

props: {showAllNode: {type: Boolean,default: false}
},
methods: {
async fetchDictTree() {let children = this.data.data[0].children || []// 添加全选节点this.treeData = this.showAllNode ? [this.allNode, ...children] : children// 获取所有节点值(一维数组)this.allNodeValues = this.getAllNodeValues()// 修改初始化逻辑if (this.showAllNode) {// 选中所有节点(包括全选节点)this.selectedValue = ['0', ...this.allNodeValues]this.lastSelectedValue = [...this.selectedValue]} else {this.selectedValue = []this.lastSelectedValue = []}this.$emit('input', this.selectedValue)this.$emit('ready', true)},
}
2. 全选按钮与其他节点的联动效果:
  • 点击全选按钮所有节点都被选中,非全选状态下全选按钮不被选中
    if (this.showAllNode) {// 检查是否包含全选节点const hasAll = value.includes('0')const prevHasAll = this.lastSelectedValue.includes('0')if (hasAll && !prevHasAll) {// 选中全选,同时选中所有节点const allValues = ['0', ...this.allNodeValues]this.selectedValue = allValuesthis.lastSelectedValue = [...allValues]// 只返回 ['0'] 表示全选this.$emit('input', ['0'])this.$emit('change', ['0'])return} else if (!hasAll && prevHasAll) {// 取消全选,清空所有选中setTimeout(() => {this.selectedValue = []this.lastSelectedValue = []this.$emit('input', [])this.$emit('change', [])}, 0)return}// 检查是否所有节点都被选中const allSelected = this.allNodeValues.every(nodeValue =>value.includes(nodeValue))// 如果所有节点都被选中,但全选节点没有被选中,则添加全选节点if (allSelected && !hasAll) {const newValue = ['0', ...value]this.selectedValue = newValuethis.lastSelectedValue = [...newValue]// 只返回 ['0'] 表示全选this.$emit('input', ['0'])this.$emit('change', ['0'])return}// 如果不是所有节点都被选中,但全选节点被选中了,则移除全选节点if (!allSelected && hasAll) {const newValue = value.filter(v => v !== '0')this.selectedValue = newValuethis.lastSelectedValue = [...newValue]this.$emit('input', newValue)this.$emit('change', newValue)return}}
3. 全选按钮选中时传回的节点数据(dictKey)的值为0而非所有节点key值
watch: {value: {handler(val) {// 如果传入的值是 ['0'],表示选中全选节点if (Array.isArray(val) && val.length === 1 && val[0] === '0' && this.showAllNode) {// 内部选中所有节点this.selectedValue = ['0', ...this.allNodeValues]} else if (!this.multiple && Array.isArray(val) && val.length === 1) {// 单选模式下,如果传入的是数组,取第一个元素this.selectedValue = val[0]} else {this.selectedValue = val}},immediate: true},},

组件使用:

<template><div><classify-cascader v-model="classify" placeholder="请选择试卷分类" multiplecheckStrictly show-all-node width="200px" /></div>
</template><script>
import classifyCascader from '@/components/classify-cascader/index.vue'export default {name: 'indexVue',components: {classifyCascader},data() {return {classify: []}}
}
</script>
  • 笔者已经分装好了一个组件,可以直接使用,如果下拉框的数据是从后端获取的话,改一下fetchDictTree() 方法中 children 的数据赋值代码就可以,类似于:
const { data } = await APIgetDictTree(params)
let children = data.data[0].children || []

组件实现:

<template><el-cascader v-model="selectedValue" :options="treeData" :props="cascaderProps" :placeholder="placeholder":disabled="disabled" :clearable="clearable" :style="{ width: width }" collapse-tags @change="handleChange" />
</template><script>export default {name: 'ClassifyCascader',props: {value: {type: [String, Array],default: () => []},checkStrictly: {type: Boolean,default: false},multiple: {type: Boolean,default: false},showAllNode: {type: Boolean,default: false},disabled: {type: Boolean,default: false},placeholder: {type: String,default: '请选择'},clearable: {type: Boolean,default: true},width: {type: String,default: '200px'}},data() {return {treeData: [],selectedValue: this.value,cascaderProps: {value: 'dictKey',label: 'dictValue',children: 'children',checkStrictly: this.checkStrictly,multiple: this.multiple,emitPath: false},allNode: {dictKey: '0',dictValue: '全选'},lastSelectedValue: [],allNodeValues: [], // 存储所有节点的值(一维数组)data: {data: [{children: [{dictKey: '1',dictValue: '分类1'},{dictKey: '2',dictValue: '分类2',children: [{dictKey: '2-1',dictValue: '子分类2-1',children: []},{dictKey: '2-2',dictValue: '子分类2-2',children: []}]}]}]}}},watch: {value: {handler(val) {// 如果传入的值是 ['0'],表示选中全选节点if (Array.isArray(val) && val.length === 1 && val[0] === '0' && this.showAllNode) {// 内部选中所有节点this.selectedValue = ['0', ...this.allNodeValues]} else if (!this.multiple && Array.isArray(val) && val.length === 1) {// 单选模式下,如果传入的是数组,取第一个元素this.selectedValue = val[0]} else {this.selectedValue = val}},immediate: true},},created() {this.fetchDictTree()},methods: {// 刷新数据refreshData() {return this.fetchDictTree()},async fetchDictTree() {let children = this.data.data[0].children || []// 添加全选节点this.treeData = this.showAllNode ? [this.allNode, ...children] : children// 获取所有节点值(一维数组)this.allNodeValues = this.getAllNodeValues()// 修改初始化逻辑if (this.showAllNode) {// 选中所有节点(包括全选节点)this.selectedValue = ['0', ...this.allNodeValues]this.lastSelectedValue = [...this.selectedValue]} else {this.selectedValue = []this.lastSelectedValue = []}this.$emit('input', this.selectedValue)this.$emit('ready', true)},handleChange(value) {if (this.showAllNode) {// 检查是否包含全选节点const hasAll = value.includes('0')const prevHasAll = this.lastSelectedValue.includes('0')if (hasAll && !prevHasAll) {// 选中全选,同时选中所有节点const allValues = ['0', ...this.allNodeValues]this.selectedValue = allValuesthis.lastSelectedValue = [...allValues]// 只返回 ['0'] 表示全选this.$emit('input', ['0'])this.$emit('change', ['0'])return} else if (!hasAll && prevHasAll) {// 取消全选,清空所有选中setTimeout(() => {this.selectedValue = []this.lastSelectedValue = []this.$emit('input', [])this.$emit('change', [])}, 0)return}// 检查是否所有节点都被选中const allSelected = this.allNodeValues.every(nodeValue =>value.includes(nodeValue))// 如果所有节点都被选中,但全选节点没有被选中,则添加全选节点if (allSelected && !hasAll) {const newValue = ['0', ...value]this.selectedValue = newValuethis.lastSelectedValue = [...newValue]// 只返回 ['0'] 表示全选this.$emit('input', ['0'])this.$emit('change', ['0'])return}// 如果不是所有节点都被选中,但全选节点被选中了,则移除全选节点if (!allSelected && hasAll) {const newValue = value.filter(v => v !== '0')this.selectedValue = newValuethis.lastSelectedValue = [...newValue]this.$emit('input', newValue)this.$emit('change', newValue)return}}// 正常情况下的处理this.lastSelectedValue = [...value]const outputValue = Array.isArray(value) ? value : [value]this.$emit('input', outputValue)this.$emit('change', outputValue)},// 获取所有节点的值(一维数组)getAllNodeValues() {const allValues = []const traverse = (nodes) => {nodes.forEach(node => {if (node.dictKey === '0') returnallValues.push(node.dictKey)if (node.children && node.children.length > 0) {traverse(node.children)}})}traverse(this.treeData)return allValues}}
}
</script>

大家有什么问题可以评论区交流一下,我看到了也会回复的。

http://www.dtcms.com/wzjs/251027.html

相关文章:

  • 多个链接的网站怎么做今日新闻国家大事
  • 如何查做的网站排名寻找郑州网站优化公司
  • wordpress素锦广州优化防控措施
  • 安卓下载app沈阳seo关键词排名
  • 易语言网站做软件文章优化软件
  • 缩短链接搜索引擎网站优化推广
  • 网站后台制作表格优化网站首页
  • 绵阳网站广州网络公司
  • 咪咕动态网站怎么做企业短视频推广
  • 没有网站可以做域名解析吗百度客服投诉中心
  • 兰州网站建设网站建设网络营销的模式有哪些
  • 云服务器做网站好吗韩国网站
  • 宁波做网站优化哪家好厦门百度公司
  • 天津企业模板建站哪个好seo排名点击手机
  • 建筑工程网站建设企业关键词优化最新报价
  • 免费拓客100个方法seo模拟点击
  • 公司如何申请一个网站网址品牌设计
  • html音乐网页完整代码百度seo泛解析代发排名
  • 30岁学网站建设四川整站优化关键词排名
  • wordpress菜单和页面的关系seo站长工具 论坛
  • 做网站开发用什么APP好店铺引流的30种方法
  • 上海 宝安网站建设 网络服务全渠道营销案例
  • 廊坊盘古网站建设市场营销网络
  • 苏州免费模板建站无锡百度推广代理公司
  • 武汉云优化网站建设宁波seo整体优化
  • 怎样做网站的反链永久免费个人网站注册
  • 太原网站排名公司免费crm网站不用下载的软件
  • 上海电子网站建设百度搜索引擎原理
  • 怎么做网站的广告58同城推广效果怎么样
  • 门户网站建设的好处站长工具权重