让element-ui的输入框聚焦的4种方式

方法一、绑定ref
方法二、通过自定义事件中的事件对象 $event,找到input
方法三、使用自定义指令
方法四、使用原生input
案例:登录页-进入页面让用户名输入框自动聚焦、按enter键让密码框聚焦,完整输入信息后登录


方法一、绑定ref——参考yiyueqinghui

<el-input v-model="form.name" ref="name"></el-input>
this.$refs.name.focus();

方法二、通过事件中的事件对象 $event,找到input——参考Z.R.J

<el-input v-model="form.name" ref="name" @key.enter.native="inputFocus($event)"></el-input>

inputFocus(e){
	e.target.focus();
	e.target.blur(); //让输入框失去焦点
}

方法三、使用自定义指令——官网



directives: {
    focus: {
        inserted: function (el) {
        	console.log(el);
        	//因为el-input这是个组件,input外面被一层 div 包裹着
        	//el打印出来是外面这个 div,需要找到内层的input
        	el.children[1].focus();
        }
    }
}

让element-ui的输入框聚焦的4种方式_第1张图片


方法四、使用原生——参考 萝卜爱吃青菜

<input type="text" id="userName" name="username" autofocus="autofocus"/>

this.$nextTick(()=>{
	var userName = document.getElementById("userName");
	userName.focus();
})

案例、进入登录页时,用户名输入框自动聚焦、按enter键让密码框聚焦,完整输入信息后登录

思路:(可以跳过这一步看完整代码——完整代码)
1. 进入页面时,用户名输入框就要获取焦点,使用 自定义指令 聚焦更方便。当然也可以用 ref 在 mounted() 钩子函数中让输入框聚焦。

mounted(){
	this.$nextTick(()=>{      
		this.$refs.userName.focus();
	});
}

2. 在用户输入框输入信息后,需要按 Enter 键,使下一个输入框聚焦,此时要用到按键事件。同时还要考虑按下 enter 键后,输入框内是否有值。如果没有值,那么就让用户输入框失去焦点,这一步的作用是让 element封装好的表单验证信息显示出来,然后再让用户输入框重新聚焦。

confirmInput(e){
   if(e.target.value !=""){
     e.target.blur();
   } else {
     e.target.blur();
     e.target.focus();
   }
 },

3. 用户在密码框输入密码后,要进行登录操作。同样要判断这个输入框是否有值。


完整代码:

<el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="loginForm">
  <el-form-item prop="userName">
    <el-input type="text" size="medium" ref="userName"
               v-focus v-model="ruleForm.userName" 
              @keyup.enter.native="confirmInput($event,false)">
      <template slot="prepend">用户名:</template>
    </el-input>
  </el-form-item>
  <el-form-item prop="password">
    <el-input type="password" v-model="ruleForm.password"
              size="medium" ref="password"
              @keyup.enter.native="confirmInput($event,true)">
      <template slot="prepend">密码:</template>
    </el-input>
  </el-form-item>
  <el-form-item class="checkboxItem">
    <el-checkbox label="记住密码"></el-checkbox>
  </el-form-item>
  <div class="submitBtn">
    <p @click="loginEnter">登 录</p>
  </div>
</el-form>

data(){
  return {
    rules: {
      userName: [
        { required: true, message: '请输入用户名', trigger: 'blur' }
      ],
      password: [
        { required: true, message: '请输入密码', trigger: 'blur' }
      ]
    },
    ruleForm: {
      userName: "",
      password: ""
    }
  }
},
directives:{
    focus: {
      inserted: function(el){
        el.children[1].focus();
      }
    }
  },
methods: {
 //按Enter键
 confirmInput(e,isLogin){
   // 判断输入框是否有值,有的话失焦让另外一个输入框聚焦;
   // 没有就先失焦让提示显示出来,再重新聚焦(这样可以让element表单封装的验证信息显示出来)
   if(e.target.value !=""){
     e.target.blur();
     this.inputFocus(isLogin);
   } else {
     e.target.blur();
     e.target.focus();
   }
 },

 //通过isLogin这个参数来判断密码输入框的填写情况
 //如果有多个输入框,可以在这一步多传入一个参数,用参数来代替 this.$refs.password.focus(); 中的password
 inputFocus(isLogin){
   if(isLogin){
     this.loginEnter();
   } else {
     this.$refs.password.focus();
   }
 },

 // 登录
 loginEnter(){
   this.$refs.ruleForm.validate((valid) => {
     if (valid) {
       this.$router.replace('/productWarehouse/history');
     } else {
       alert('error submit!!');
       return false;
     }
   });
 }
}

想放个动图的,但是太大了。。就酱紫将就一下吧!^ - ^

你可能感兴趣的:(vue项目问题)