Vue-(4)表单-组件-自定义事件

一:表单

v-model 会根据控件类型自动选取正确的方法来更新元素





Vue 测试实例 - 菜鸟教程(runoob.com)



input 元素:

消息是: {{ message }}

textarea 元素:

{{ message2 }}

运行结果:

QQ20210817-142452-HD.gif

复选框
复选框如果是一个为逻辑值,如果是多个则绑定到同一个数组:





Vue 测试实例 - 菜鸟教程(runoob.com)



单个复选框:

多个复选框:


选择的值为: {{ checkedNames }}

运行结果:

QQ20210817-142741-HD.gif

单选按钮
以下实例中演示了单选按钮的双向数据绑定:





Vue 测试实例 - 菜鸟教程(runoob.com)





选中值为: {{ picked }}

运行结果:

QQ20210817-142919-HD.gif

select 列表
以下实例中演示了下拉列表的双向数据绑定





Vue 测试实例 - 菜鸟教程(runoob.com)



选择的网站是: {{selected}}

运行结果:

QQ20210817-143040-HD.gif
修饰符

.lazy
在默认情况下, v-model 在 input 事件中同步输入框的值与数据,但你可以添加一个修饰符 lazy ,从而转变为在 change 事件中同步:



.number
如果想自动将用户的输入值转为 Number 类型(如果原值的转换结果为 NaN 则返回原值),可以添加一个修饰符 number 给 v-model 来处理输入值:


这通常很有用,因为在 type="number" 时 HTML 中输入的值也总是会返回字符串类型。

.trim
如果要自动过滤用户输入的首尾空格,可以添加 trim 修饰符到 v-model 上过滤输入:


二:组件

组件(Component)是 Vue.js最强大的功能之一。
组件可以扩展 HTML 元素,封装可重用的代码。
组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树:

image.png

注册一个全局组件语法格式如下:

Vue.component(tagName, options)

tagName 为组件名,options 为配置选项。注册后,我们可以使用以下方式来调用组件:


全局组件: 所有实例都能用全局组件。
注册一个简单的全局组件runoob,并使用它:





Vue 测试实例 - 菜鸟教程(runoob.com)



结果:

自定义组件!

局部组件: 实例选项中注册局部组件,这样组件只能在这个实例中使用:。
注册一个简单的局部组件runoob,并使用它:





Vue 测试实例 - 菜鸟教程(runoob.com)



结果:

自定义组件!

Prop: prop 是子组件用来接受父组件传递过来的数据的一个自定义属性。
父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop":





Vue 测试实例 - 菜鸟教程(runoob.com)



结果:

hello!

动态 Prop: 类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:





Vue 测试实例 - 菜鸟教程(runoob.com)




结果:输入框改变,下面的内容也变

image.png

动态 Prop: 类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。每当父组件的数据变化时,该变化也会传导给子组件:





Vue 测试实例 - 菜鸟教程(runoob.com)



结果

1. Runoob
2. Google
3. Taobao

Prop 验证: 组件可以为 props 指定验证要求。
为了定制 prop 的验证方式,你可以为 props 中的值提供一个带有验证需求的对象,而不是一个字符串数组。例如:

Vue.component('my-component', {
  props: {
    // 基础的类型检查 (`null` 和 `undefined` 会通过任何类型验证)
    propA: Number,
    // 多个可能的类型
    propB: [String, Number],
    // 必填的字符串
    propC: {
      type: String,
      required: true
    },
    // 带有默认值的数字
    propD: {
      type: Number,
      default: 100
    },
    // 带有默认值的对象
    propE: {
      type: Object,
      // 对象或数组默认值必须从一个工厂函数获取
      default: function () {
        return { message: 'hello' }
      }
    },
    // 自定义验证函数
    propF: {
      validator: function (value) {
        // 这个值必须匹配下列字符串中的一个
        return ['success', 'warning', 'danger'].indexOf(value) !== -1
      }
    }
  }
})

当 prop 验证失败的时候,(开发环境构建版本的) Vue 将会产生一个控制台的警告。
type 可以是下面原生构造器:

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

type 也可以是一个自定义构造器,使用 instanceof 检测。

三:自定义事件

父组件是使用props传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件!
我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:

  • 使用 $on(eventName) 监听事件
  • 使用 $emit(eventName)触发事件

另外,父组件可以在使用子组件的地方直接用v-on来监听子组件触发的事件。
以下实例中子组件已经和它外部完全解耦了。它所做的只是触发一个父组件关心的内部事件。





Vue 测试实例 - 菜鸟教程(runoob.com)



{{ total }}

结果:

image.png

如果你想在某个组件的根元素上监听一个原生事件。可以使用 .native 修饰 v-on 。例如:


data必须是一个函数
上面例子中,可以看到 ·button-counter 组件中的data不是一个对象,而是一个函数:

data: function () {
  return {
    count: 0
  }
}

这样的好处就是每个实例可以维护一份被返回对象的独立的拷贝,如果 data 是一个对象则会影响到其他实例,如下所示:





Vue 测试实例 - 菜鸟教程(runoob.com)



结果:点击8次的效果

image.png

自定义组件的 v-model
组件上的 v-model 默认会利用名为 valueprop和名为 input 的事件。

 

等价于:


以下实例自定义组件 runoob-input,父组件的 num 的初始值是 100,更改子组件的值能实时更新父组件的 num:





Vue 测试实例 - 菜鸟教程(runoob.com)



输入的数字为:{{num}}

结果:

image.png

由于 v-model 默认传的是 value,不是 checked,所以对于复选框或者单选框的组件时,我们需要使用 model 选项,model 选项可以指定当前的事件类型和传入的 props。

由于 v-model 默认传的是 value,不是 checked,所以对于复选框或者单选框的组件时,我们需要使用 model 选项,model 选项可以指定当前的事件类型和传入的 props。

结果:

image.png

data 也可以是对象:

Vue.component('button-counter2', {
    /*
    data: function () {
    // data 选项是一个函数,组件不相互影响
        return {
            count: 0
        }
    },
    */
    data: function () {
        // data 选项是一个对象,会影响到其他实例
        return buttonCounter2Data
    },
    template: ''
})

注释起来的 data 代码和未注释起来的 data 都是函数,只是注释起来的函数返回值是每执行一次函数就产生一个独立的对象,而未注释的data函数返回值却是引用了一个已有对象的名称(即对象的引用),不管函数执行多少次返回值都是这个外部定义的对象的引用而已,也就是说不管有多少个组件,所有的组件维护的数据都是同一个对象的数据而已,所以一个组件的数据发生变化同样会影响到其他所有的组件的数据。。。

你可能感兴趣的:(Vue-(4)表单-组件-自定义事件)