Select 下拉框切换拦截的三种方案|【Proxy】

简介: Select 下拉框切换拦截的三种方案|【Proxy】

前言


select 下拉框,想必我们都经常用的,不论是表单提交还是搜索,都常有它的身影,现在的组件库也都有封装相关组件,如 ant-design-vue 的 a-select、element-ui 的 el-select,用法有普通的选择、多选、支持搜索和模糊搜索的选择、联动等,然而这么常见的组件却没有一个提供 beforeChange 勾子。

那么你有没有遇到过需要对 select 切换进行拦截的操作?我今天就遇到了这样的需求,让我们来搞定它吧。


效果图:


1687778714106.png


在线测试地址


要点


各种 select 组件默认只提供了选项改变后的 change 事件回调,如果在 change 事件里绑定弹窗事件的话会导致,Modal 对话框弹出时选项已经改变,此时选择取消操作,则还需要数据回溯,视觉体验上也不好,属于先斩后奏;针对这个问题,还是要从拦截的角度来思考,下面是我提供的三种方案。

event.stopPropagation

这个思路是通过阻止事件的传播,来进行拦截的,可以给 a-select-option 下的dom 增加click 事件,加一个事件修饰符 click.stop (阻止单击事件继续传播)


// 伪代码
<a-select-option value="上海">
  <div @click.stop="handleClick">上海测试</div>
</a-select-option>
methods: {
    handleClick(item) {
        let _this = this
        _this.$confirm({
            title: "确认要切换么?",
            content: "切换经销商将重新载入页面数据",
            mask: false,
            onOk() {
              _this.data.value = item.value
            },
            onCancel() {},
          });
    }
}


Object.defineProperty


Object.defineProperty() 方法允许通过属性描述对象,定义或修改一个属性,然后返回修改后的对象,具体语法可以看这本书 javascript 教程 的属性描述对象章节; 这里我用它的存值函数 set 来对 data.value 进行处理


<a-select
    centered
    default-value="lucy"
    style="width: 120px"
    v-model="data.value"
    >
    <a-select-option value="上海"> 上海测试 </a-select-option>
    <a-select-option value="河南"> 河南测试 </a-select-option>
    <a-select-option value="深圳">深圳测试</a-select-option>
</a-select>
methods: {
   initProxy() {
      let _this = this
      Object.defineProperty(this.data, "value", {
        set: function (value) {
          _this.$confirm({
            title: "确认要切换么?",
            content: "切换经销商将重新载入页面数据",
            mask: false,
            onOk() {
              return value
            },
            onCancel() {},
          });
        },
      })
  },
  mounted() {
    this.initProxy()
  }


Proxy 拦截


Proxy 可以对 a-select 的 value 进行拦截,然后修改其默认行为,这和直接修改 value 不同;等同于在语言层面做出修改,属于一种“元编程”(meta programming),即对编程语言进行编程。

具体语法可看下这本书: ECMAScript6 入门 的 proxy 章节,这里不多介绍了,还是直接上代码:


<a-select
    centered
    default-value="lucy"
    style="width: 120px"
    v-model="data.value"
    >
    <a-select-option value="上海"> 上海测试 </a-select-option>
    <a-select-option value="河南"> 河南测试 </a-select-option>
    <a-select-option value="深圳">深圳测试</a-select-option>
</a-select>
  methods: {
    initProxy() {
      let _this = this;
      this.data = new Proxy(
        { value: "上海" },
        {
          set: function (target, propKey, value) {
            return _this.$confirm({
              title: "确认要切换么?",
              content: "切换经销商将重新载入页面数据",
              mask: false,
              onOk() {
                target["value"] = value
              },
              onCancel() {},
            })
          },
        }
      )
    },
  },
  mounted() {
    this.initProxy()
  },


顺带讲一下a-select 的 v-model, v-model 默认是只支持 input 事件的,ant-design-vue 的源码中用 model 选项重写了 v-model 指令,将其触发条件修改为 change。


model: {
    prop: 'value',
    event: 'change'
  }


以上三种方案都可以实现我们要的效果,至于哪种更好这个地方不需要纠结,看自己喜好,因为这个需求还不足够复杂还体现不出它们的差异。


总结


今天通过一个 select 拦截的需求(radio, checkbox 同理),给大家讲解了 事件传递、Object.defineProperty、proxy 相关知识的应用,不知你有没有发现,这些貌似工具库里才经常用到的特性,也可以很好的服务于日常业务开发,是不是一件很 cool 的事呢?看后你有收获吗?

目录
相关文章
|
2月前
|
Apache
HAProxy的高级配置选项-自定义错误跳转案例
这篇文章介绍了HAProxy的高级配置选项,特别是如何实现自定义错误页面跳转的功能,并通过实战案例展示了在出现特定HTTP错误状态码时如何重定向到指定的错误页面。
72 5
|
3月前
|
开发框架 .NET 数据库连接
操作筛选器的 1 个应用实例:自动启用事务
操作筛选器的 1 个应用实例:自动启用事务
|
4月前
|
网络架构
若依修改 :id 不跳转注释的资料,路由配置:id不跳转修改,若依的store的permission.js对动态路由有控制
若依修改 :id 不跳转注释的资料,路由配置:id不跳转修改,若依的store的permission.js对动态路由有控制
若依修改 :id 不跳转注释的资料,路由配置:id不跳转修改,若依的store的permission.js对动态路由有控制
|
4月前
|
监控
若依修改-----其他功能,包括参数设置,通知公告,日志管理,验证码控制开关在参数设置里,若依的注册页面是隐藏的,在src的login.vue的97行注册开发,修改成true,通知公告,促进组织内部信
若依修改-----其他功能,包括参数设置,通知公告,日志管理,验证码控制开关在参数设置里,若依的注册页面是隐藏的,在src的login.vue的97行注册开发,修改成true,通知公告,促进组织内部信
|
5月前
|
SQL XML JSON
技术心得:查询重置功能的实现
技术心得:查询重置功能的实现
33 0
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
vxe-table可编辑状态默认显示下拉选select为默认展示
vxe-table可编辑状态默认显示下拉选select为默认展示
|
前端开发
前端工作总结122-无法选中的状态一定要绑定在select上面
前端工作总结122-无法选中的状态一定要绑定在select上面
75 0
|
Web App开发 JavaScript iOS开发
求助,主页面通过iframe访问ngnix中的子页面,子页面中利用调用js方法判断localstonge中是否有值,ios不可用,关闭阻止跨网站追踪,safari可用
紧急求助,主页面通过iframe访问ngnix中的子页面,子页面中利用调用js方法判断localstonge中是否有值,ios不可用,关闭阻止跨网站追踪,safari可用