vue2基础系列教程之v-model及面试高频问题

v-model是表单组件里面的核心知识点,这个指令给我们写表单业务带来了很大的方便。

  • 元素标签上的 v-model 指令用于双向绑定数据,它是一个语法糖,可以用于代替 v-bind:value@input

    • 例如:<input v-model="message" placeholder="edit me">
    • 相当于:<input :value="message" @input="message = $event.target.value">
  • 组件上的 v-model 指令默认会使用 value 属性与组件数据双向绑定,可以通过 model 选项来更改

一般使用

js 复制代码
const inputTemplate = `
          <input :placeholder="message" v-bind:value="value" @input="updateValue" />`;
Vue.component("custom-input", {
  template: inputTemplate,
  props: ["value", "message"],
  methods: {
    updateValue(e) {
      this.$emit("input", e.target.value);
    },
  },
});

var app = new Vue({
  el: "#app",
  data() {
    return {
      message: "",
      username: "",
    };
  },
  methods: {
    onFocus() {
      this.message = "输入框被点击了";
    },
    onBlur() {
      this.message = "";
    },
  },
});
html 复制代码
<div id="app">
  <h3>{{username}}</h3>
  <custom-input v-model="username" :placeholder="message" />
</div>

自定义组件绑定原生事件

根据 vue 的设计理念,自定义组件上的属性和事件,会默认绑定到组件的根元素上,如果想要绑定到组件的原生事件上,需要使用 .native 修饰符。

也就是我们在组件内部不使用 props 进行显示的接受,这些属性和事件会默认的绑定到组件的根元素上。 @focus.native="onFocus" @blur.native="onBlur" class="custom-input" 这三个属性我在组件内部没有使用 props 进行接受,但是却可以正常的使用。

html 复制代码
<div id="app">
  <h3>{{username}}</h3>
  <custom-input
    class="custom-input"
    v-model="username"
    :placeholder="message"
    @focus.native="onFocus"
    @blur.native="onBlur"
  />
</div>
js 复制代码
const inputTemplate = `
          <input :placeholder="message" v-bind:value="value" @input="updateValue" />`;
Vue.component("custom-input", {
  template: inputTemplate,
  props: ["value", "message"],
  methods: {
    updateValue(e) {
      this.$emit("input", e.target.value);
    },
  },
});

var app = new Vue({
  el: "#app",
  data() {
    return {
      message: "请输入要显示的文字",
      username: "",
    };
  },
  methods: {
    onFocus() {
      this.message = "输入框被点击了";
    },
    onBlur() {
      this.message = "";
    },
  },
});

关于inheritAttrs

在 vue2.4 版本中,新增了 inheritAttrs 选项,默认情况下,组件上没有在 props 中声明的属性会被添加到组件的根元素上。

有时候,我们不希望这些属性添加到组件的根元素上,可以通过设置 inheritAttrs: false 来关闭这个功能。

同时,改造下inputTemplate

这时候,我们发现focusblur事件失效了,没有报错,就是没有触发。

这种情况,就需要我们手动来处理了,原因就是上面的原理

js 复制代码
const inputTemplate = `
          <label>{{label}}
            <input  :placeholder="placeholder" :value="value" @input="updateValue" v-on="customListeners"/>
          </label>`;
Vue.component("custom-input", {
  inheritAttrs: false,
  template: inputTemplate,
  props: ["value", "placeholder", "label"],
  methods: {
    updateValue(e) {
      this.$emit("input", e.target.value);
    },
  },
  computed: {
    customListeners() {
      var vm = this;
      console.log("🚀 ~ customListeners ~ this.$listeners:", this.$listeners);
      return Object.assign({}, this.$listeners, {
        input: (e) => {
          vm.$emit("input", e.target.value);
        },
      });
    },
  },
});

var app = new Vue({
  el: "#app",
  data() {
    return {
      message: "请输入要显示的文字",
      username: "",
      label: "账号:",
    };
  },
  methods: {
    onFocus() {
      this.message = "输入框被点击了";
    },
    onBlur() {
      this.message = "";
    },
  },
});
html 复制代码
<div id="app">
     <h3> {{username}}</h3>
      <custom-input class="custom-input" v-model="username" :placeholder="message" @focus="onFocus" @blur="onBlur" :label="label"/>
</div>

注意这里@focus="onFocus" @blur="onBlur",要去掉.native,不然也不生效

相关推荐
桂月二二5 小时前
探索前端开发中的 Web Vitals —— 提升用户体验的关键技术
前端·ux
沈梦研6 小时前
【Vscode】Vscode不能执行vue脚本的原因及解决方法
ide·vue.js·vscode
hunter2062066 小时前
ubuntu向一个pc主机通过web发送数据,pc端通过工具直接查看收到的数据
linux·前端·ubuntu
qzhqbb6 小时前
web服务器 网站部署的架构
服务器·前端·架构
刻刻帝的海角6 小时前
CSS 颜色
前端·css
轻口味6 小时前
Vue.js 组件之间的通信模式
vue.js
九酒6 小时前
从UI稿到代码优化,看Trae AI 编辑器如何帮助开发者提效
前端·trae
浪浪山小白兔7 小时前
HTML5 新表单属性详解
前端·html·html5
lee5767 小时前
npm run dev 时直接打开Chrome浏览器
前端·chrome·npm
2401_897579657 小时前
AI赋能Flutter开发:ScriptEcho助你高效构建跨端应用
前端·人工智能·flutter