发表于: 2021-04-13 20:38:37

1 758


今天完成的事情:


vue事件处理器

事件监听可以使用 v-on 指令:

    <div id="app">
        <button v-on:click="counter += 1">增加 1</button>
        <p>这个按钮被点击了 {{ counter }} 次。</p>
      </div>
      
      <script>
      new Vue({
        el: '#app',
        data: {
          counter: 0
        }
      })

事件修饰符

Vue.js 为 v-on 提供了事件修饰符来处理 DOM 事件细节,如:event.preventDefault() 或 event.stopPropagation()

Vue.js 通过由点 . 表示的指令后缀来调用修饰符

.stop - 阻止冒泡

.prevent - 阻止默认事件

.capture - 阻止捕获

.self - 只监听触发该元素的事件

.once - 只触发一次

.left - 左键事件

.right - 右键事件

.middle - 中间滚轮事件

<!-- 阻止单击事件冒泡 -->
<a v-on:click.stop="doThis"></a>
<!-- 提交事件不再重载页面 -->
<form v-on:submit.prevent="onSubmit"></form>
<!-- 修饰符可以串联  -->
<a v-on:click.stop.prevent="doThat"></a>
<!-- 只有修饰符 -->
<form v-on:submit.prevent></form>
<!-- 添加事件侦听器时使用事件捕获模式 -->
<div v-on:click.capture="doThis">...</div>
<!-- 只当事件在该元素本身(而不是子元素)触发时触发回调 -->
<div v-on:click.self="doThat">...</div>

<!-- click 事件只能点击一次,2.1.4版本新增 -->
<a v-on:click.once="doThis"></a>


表单

输入框:

    <div id="app">
        <p>input 元素:</p>
        <input v-model="message" placeholder="编辑我……">
        <p>消息是: {{ message }}</p>
      </div>
      <script>
      new Vue({
        el: '#app',
        data: {
          message: 'Runoob',
        }
      })

复选框:

    <div id="app">
        <p>复选框:</p>
        <input type="checkbox" id="checkbox" v-model="checked">
        <label for="checkbox">{{ checked }}</label>
      </div>
      <script>
      new Vue({
        el: '#app',
        data: {
          checked : false
        }
      })

select 列表:

    <div id="app">
        <select v-model="selected" name="fruit">
          <option value="">选择一个网站</option>
          <option value="www.runoob.com">Runoob</option>
          <option value="www.google.com">Google</option>
        </select>
        <div id="output">
            选择的网站是: {{selected}}
        </div>
      </div>
      <script>
      new Vue({
        el: '#app',
        data: {
          selected: '' 
        }
      })

修饰符

.lazy

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

.number

如果想自动将用户的输入值转为 Number 类型,可以添加一个修饰符 number 给 v-model 来处理输入值

.trim

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

    <input v-model.lazy="m" >
    <input v-model.number="age" type="number">
    <input v-model.trim="msg">


组件

组件可以扩展 HTML 元素,封装可重用的代码

注册一个全局组件语法格式,tagName 为组件名,options 为配置选项

        Vue.component(tagNameoptions)

全局组件:

    <div id="app">
        <runoob></runoob>
    </div>
    <script>
        Vue.component('runoob', {
            template: '<h1>自定义组件!</h1>'
        })
        new Vue({
            el: '#app',
        })

Prop

prop 是子组件用来接受父组件传递过来的数据的一个自定义属性

父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop"

    <div id="app">
        <child message="hello!"></child>
    </div>
    // 注册
    Vue.component('child', {
      // 声明 props
      props: ['message'],
      // 同样也可以在 vm 实例中像 “this.message” 这样使用
      template: '<span>{{ message }}</span>'
    })
    // 创建根实例
    new Vue({
      el: '#app'
    })


组件自定义事件

父组件是使用 props 传递数据给子组件,如果子组件要把数据传递回去,就需要使用自定义事件

使用 $on(eventName) 监听事件

使用 $emit(eventName) 触发事件

例:

    <div id="app">
        <div id="counter-event-example">
            <p>{{ total }}</p>
            <button-counter v-on:increment="incrementTotal"></button-counter>
            <button-counter v-on:increment="incrementTotal"></button-counter>
        </div>
    </div>

    <script>
        Vue.component('button-counter', {
            template: '<button v-on:click="incrementHandler">{{ counter }}</button>',
            data: function () {// data 选项是一个函数,组件不相互影响
                return {
                    counter: 0
                }
            },
            methods: {
                incrementHandler: function () {
                    this.counter += 1
                    this.$emit('increment')
                }
            },
        })
        new Vue({
            el: '#counter-event-example',
            data: {
                total: 0
            },
            methods: {
                incrementTotal: function () {
                    this.total += 1
                }
            }
        })

其中data 必须是一个函数,而不是一个对象。这样的好处就是每个实例可以维护一份被返回对象的独立的拷贝,如果 data 是一个对象则会影响到其他实例


自定义指令

除了默认设置的核心指令( v-model 和 v-show ), Vue 也允许注册自定义指令

注册一个全局指令 v-focus

    <div id="app">
        <p>页面载入时,input 元素自动获取焦点:</p>
        <input v-focus>
    </div>
    <script>
    // 注册一个全局自定义指令 v-focus
    Vue.directive('focus', {
      // 当绑定元素插入到 DOM 中。
      inserted: function (el) {
        // 聚焦元素
        el.focus()
      }
    })
    // 创建根实例
    new Vue({
      el: '#app'
    })


明天的计划:

学习vue.ajax


返回列表 返回列表
评论

    分享到