关于vue中输入框的使用场景总结

目录
  • 输入框的使用场景总结
    • 1. 自动聚焦
    • 2. 如何优雅的实现下面效果
  • 关于输入框的一些操作

输入框的使用场景总结

1. 自动聚焦

第1种方法:使用 $nextTick

<input ref="myInput" v-model="text"/>
mounted() {
  this.$nextTick(function () {
    this.$refs.myInput.focus();
  });
},

第2种方法:自定义 v-focus 指令

为了方便,这里用到了 jquery

Vue.directive('focus', {
  inserted(el) {
    // 兼容 Element 基于原生 input 封装的输入框组件
    let innerInput = el.querySelector('input');
    if (innerInput) {
      innerInput.focus();
    // 兼容原生 input
    } else {
      el.focus();
    }
  },
});

如果你有一个按钮可以控制输入框的显示和隐藏,需要每次显示的时候都自动聚焦,那要 v-if 而不能使用 v-show,因为只有 v-if 才能触发自定义指令的 inserted 生命周期函数。

<input v-if="visible" v-focus v-model="text"/>

2. 如何优雅的实现下面效果

效果描述:我们在开发表格的时候经常会遇到一个输入框,输入框聚焦的时候会显示输入框后面的“保存”按钮,失焦的时候后面的“保存”按钮隐藏。点击保存,保存输入框里面的内容。输入框失焦的时候(点击保存按钮保存成功除外),输入框里面的内容要显示原先的内容。

这里实现的时候会遇到一些比较恶心的地方,比如说,点击保存按钮,输入框失焦了,保存按钮先隐藏了,就不会触发按钮上绑定的点击事件,等等。话不多说,直接上代码,看怎么优雅的去实现它。

代码实现:

<template>
  <div>
    <el-table
      :data="tableData"
      border
    >
      <el-table-column
        label="商家编码"
        width="200"
      >
        <template slot-scope="{row, $index}">
          <input
            style="width: 100px;"
            v-model="row.skuOuterId"
            @focus="toggleFocus($event, $index, row, true)"
            @blur="toggleFocus($event, $index, row, false)"
          />
          <el-button
            :class="`J_saveBtn_${$index}`"
            :ref="'saveBtn_' + $index"
            v-show="row.showSaveBtn"
            type="primary"
          >保存
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </div>
</template>
<script>
export default {
  data() {
    return {
      tableData: [
        {
          skuOuterId: '123',
          oldSkuOuterId: '123',
          showSaveBtn: false,
        }
      ]
    };
  },
  methods: {
    toggleFocus(e, $index, data = {}, isFocus = false) {
      // 聚焦
      if (isFocus) {
        data.showSaveBtn = true;
      // 失焦
      } else {
        // 点击“保存”失焦(判断失焦时关联的目标元素是不是输入框后面的保存按钮)
        if (e.relatedTarget === this.$refs[`saveBtn_${$index}`].$el) {
          axios.post('/updateSkuOuterId', {skuOuterId: data.skuOuterId}).then(res => {
            // 保存成功
            data.oldSkuOuterId = data.skuOuterId;
          }).catch(() => {
            data.skuOuterId = data.oldSkuOuterId;
          });
        // 点击其他地址失焦
        } else {
          data.skuOuterId = data.oldSkuOuterId;
        }
        data.showSaveBtn = false;
      }
    },
  },
};
</script>

上面的代码在有横向滚动条的时候,如果出现了 e.relatedTarget === this.$refs[`saveBtn_${$index}`].$el 为 false,但我们感觉失焦的目标元素就是保存按钮的情况,我们可以把判断条件这么改一下:

e.relatedTarget === this.$refs[`saveBtn_${$index}`].$el
// 改成(下面使用了jQuery)
$(e.relatedTarget).hasClass(`J_saveBtn_${$index}`)

这样就 OK 了!

关于输入框的一些操作

关于输入框

监听输入

失去焦点的事件

<template>
  <div class="orderinfo">
  <input type="text" v-model="text" @blur="blur()">
  </div>
</template>
<script>
export default {
  name: "Orderinfo",
  data() {
    return {
      text:''
    };
  },

  mounted() {},
  watch: {
    // 监听输入框输入
    text: function(val) {
      if (val.length > 0) {
        console.log('显示删除')
      } else {
         console.log('不显示删除')
      }
    }
  },

  methods: {
    //失去焦点
    blur(){
      console.log(this.text)
    }
  }
};
</script>

<style scoped lang="scss">
</style>

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • vue 输入框输入任意内容返回数字的实现

    本文主要介绍了vue 输入框输入任意内容返回数字,具体如下: 输入任意内容只返回数字 // 提取数字 传入数字 export function changeEvent(item) { let nums = item + ""; if (nums === "") { nums = ""; // 空的话 直接返回空 } else { nums = nums.replace(/[^\d|\.]/g, ""); // 提取出来 一定是

  • Vue实现数值型输入框并限制长度

    目录 vue数值型输入框并限制长度 描述 代码 vue输入框限制各种输入格式 1.限制只能输入数字.带小数点的数字 2.限制输入的只能为11位手机号 3.电子邮箱正则 4.身份证正则 vue数值型输入框并限制长度 描述 原有的 <el-input type="number" /> 个人觉得存在问题,maxlength 属性无法生效,其次 max 属性虽然能够限制,但是无法阻止用户手动输入,因此依然存在 bug 代码 改为正则表达式方式 <el-input v-mode

  • Vue实现输入框回车发送和粘贴文本与图片功能

    目录 实现回车发送 粘贴文本 粘贴图片 总结 上一篇中,我们初步新建了一个可“双向绑定”的聊天输入框,结合实际使用的场景,如果仅仅只是实现了“双向绑定”还不够,还必须处理粘贴文字.图片等功能.本文就在此基础上,继续探讨如何实现回车发送.粘贴文本(包括HTML).粘贴图片等功能.话不多说,咱们开整.contenteditable的元素如何实现“双向绑定”? 实现回车发送 在一个可编辑元素中,默认回车就是换行.但是如果我们要实现回车是“发送”的功能,需要怎么处理呢? 思路:监听键盘事件,如果判断用户

  • vue+iview实现手机号分段输入框

    vue + iview 实现一个手机分段的提示框,知识点还没总结,供大家参考,具体内容如下 <template>   <div :class="{'ivu-form-item-error':!valid && dirty && validated}">     <div class="ivu-phone-input ivu-select  ivu-select-multiple ivu-select-default

  • Vue实现输入框@功能的示例代码

    目录 前言 成员列表 创建 使用 输入框 获取光标的坐标 保存光标 插入文本 运行结果 总结 前言 前几篇文章中分别介绍了如何实现聊天输入框的双向绑定.回车键发送.粘贴文本图片等功能,本着完善输入框的目的,文本重点介绍聊天框如何实现@功能. 文章回顾: Vue实现contenteditable元素双向绑定的方法详解 Vue实现输入框回车发送和粘贴文本与图片功能 首先需要先理清思路: 成员列表组件,需要根据光标的位置调整,点击成员项时回调成员信息 获取光标的位置坐标(x值,y值) 输入框失焦时记录

  • 关于vue中输入框的使用场景总结

    目录 输入框的使用场景总结 1. 自动聚焦 2. 如何优雅的实现下面效果 关于输入框的一些操作 输入框的使用场景总结 1. 自动聚焦 第1种方法:使用 $nextTick <input ref="myInput" v-model="text"/> mounted() { this.$nextTick(function () { this.$refs.myInput.focus(); }); }, 第2种方法:自定义 v-focus 指令 为了方便,这里用

  • vue中输入框事件的使用及数值校验方式

    目录 vue输入框事件使用及数值校验 一.@input(或者是v-on:input) 二.@change 三.@keyup.enter 四.@blur(失焦) 提示和注释 vue中常用表单校验规则整理 这里整理了一些高频率用到的校验方法 vue输入框事件使用及数值校验 最近做项目,用到vue去监听输入框当中值,并且去校验值的正确性, 我们都知道 vue 当中 主要监听输入框的方法有四个:input  change blur  keyup.enter 他们都可以使用@+xxxx="在vue当中定义

  • vue中filter的应用场景详解

    filter一般用于过滤某些值,比如我这个字段是空,可是我想在前端显示"–",就可以使用到它了. 最近碰到一个需求就是要给某些字段可以设置权限去以其他形式显示,比如以"***"显示需要隐藏的金额. 1.获取金额权限 2.通过filter过滤满足条件的字段 3.返回隐藏的样式 看代码: //其他的看,看我标注的就可以了 //scope.row 获取当前行 <template slot-scope="scope"> <templat

  • js节流防抖应用场景,以及在vue中节流防抖的具体实现操作

    故事背景: 项目有个需求是输入框在输入的时候进行搜索,展示下拉数据,但是没必要输入一个字都进行搜索,所以想到了在输入结束200毫秒后再进行搜索,从而引出来了 js的节流(throttle),防抖(debounce),在网上想找个现成的用下,但是好多都不对,于是就自己搞了. 先看看概念 函数防抖(debounce): 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时:典型的案例就是输入搜索:输入结束后n秒才进行搜索请求,n秒内又输入的内容,就重新计时. 函数节流(throttle)

  • vue中使用iview自定义验证关键词输入框问题及解决方法

    一.验证需求 对应配置的关键词输入框,验证要求如下: 1.总字数不能超过7000个: 2.去除配置的关键词特殊符号,得到的关键词组数不能超过300:(如:aaa&(bbb|ccc)|(!ddd|eee)),去掉特殊符号,有5组) 3.单个关键词长度不能超过20:(如:aaaaa&(bbb|ccc)),如果aaaaa长度超过20则提示) 二.解决方法 在关键词输入对应的FormItem中加入一个prop属性,作为验证字段使用:注意该FormItem是包含于Form的: form表单中添加ru

  • 深入浅析Vue中mixin和extend的区别和使用场景

    Vue中有两个较为高级的静态方法mixin和extend,接下来我们来讨论下关于他们各自的原理和使用场景. Mixin: 原理: 先来看看官网的介绍: 参数:{Object} mixin 用法: 混入也可以进行全局注册.使用时格外小心!一旦使用全局混入,它将影响每一个之后创建的 Vue 实例.使用恰当时,这可以用来为自定义选项注入处理逻辑. // 为自定义的选项 'myOption' 注入一个处理器. Vue.mixin({ created: function () { var myOption

  • vue.js 输入框输入值自动过滤特殊字符替换中问标点操作

    我就废话不多说了,大家还是直接看代码吧~ <Input v-model="relatedWords" type="textarea" placeholder="请输入" @input='verifyInput(formItem.relatedWords)'/> verifyInput(v){ let _this=this; let punctuation = /[`~!@#$%^&*_\-=<>?:"{}

  • Vue中的nextTick作用和几个简单的使用场景

    目的 理解下 nextTick 的作用和几个简单的使用场景 正文 起什么作用? 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 我想各位都知道或了解 Vue 的渲染流程,Vue 在监听到数据变化后会重新渲染,配合 VDOM 更新真实的 DOM,而 nextTick 的触发时机就是在调用方法后的第一次重新渲染完毕后. 如何使用? 有两种使用方法,一种是传入回调,另一种是 Promise,官方使用示例如下: // 修改数据 vm.msg = 'H

  • Vue中插槽slot的使用方法与应用场景详析

    什么是插槽? 我们知道在Vue中 Child 组件的标签 的中间是不可以包着什么的 . 可是往往在很多时候我们在使用组件的时候总想在组件间外面自定义一些标签,vue新增了一种插槽机制,叫做作用域插槽.要求的版本是2.1.0+: 插槽,其实就相当于占位符.它在组件中给你的HTML模板占了一个位置,让你来传入一些东西.插槽又分为 匿名插槽.具名插槽.作用域插槽. 在 2.6.0 中,我们为具名插槽和作用域插槽引入了一个新的统一的语法 (即 v-slot 指令).它取代了 slot 和 slot-sc

  • vue在组件中使用v-model的场景

    目录 一.使用场景 二.V-Model的本质 三.关键步骤 1. props 的使用 2. $emit 的使用 3. 关键的 model 四.不使用 model 选项的 v-model 1. 父组件 home 2. 子组件homeChild 3. 效果 五.用 model 选项的 组件使用 v-model 1.父组件 2. 子组件 一.使用场景 子组件想要使用父组件的值,又想去改父组件的值 二.V-Model的本质 1.给子组件的 value 传个变量 2.监听子组件的input事件,并且把传过

随机推荐