美文网首页
vue 基础学习 第三天

vue 基础学习 第三天

作者: 那就远走 | 来源:发表于2018-05-31 08:49 被阅读67次

21 事件的基本使用

  • 代码
<div id="app">
    <ul>
        <!-- v-on:事件="触发事件调用的函数(没有参数可以省略这个括号)" -->
        <!-- 可以简写为 @事件="函数" -->
        <li v-for="comment of comments" @dblclick="remove()"> {{ comment.id }} - {{ comment.content }} </li>
    </ul>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            comments: [
                {id: 1, content:"这是一条评论1"},
            ],
        },
        // 事件必须要写到 methods 里面
        methods: {
            remove() {
                console.log(1);
            }
        }
    });
</script>
  • 事件绑定:在宿主元素内 v-on:事件="事件触发调用的函数()" , 如果没有参数列表可以省略。
  • 事件可以简写为 @事件="函数()"
  • 事件都写在 methods 里面。

22 事件修饰符 prevent 阻止默认事件

  • 代码
<div id="app">
    <h3>表单一:不阻止,会刷新页面(action提交给本页)</h3>
    <form action="">
        <p>{{ time }}</p>
        <button type="submit">提交</button>
    </form>
    <hr>
    <h3>表单二:阻止默认事件的表单: @绑定事件在事件中阻止</h3>
    <!-- 传递 $event 参数,代表这个表单。 -->
    <form action="" @submit="submitFormOne($event)">
        <p>{{ time }}</p>
        <button type="submit">提交</button>
    </form>
    <hr>
    <h3>表单三:阻止默认事件的Vue写法: @事件.prevent</h3>
    <!-- 直接使用 @submit.prevent 来阻止 -->
    <form action="" @submit.prevent="submitFormTwo">
        <p>{{ time }}</p>
        <button type="submit">提交</button>
    </form>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            time : new Date(),
        },
        methods: {
            // 阻止表单二的默认事件
            submitFormOne(event) {
                // 采用原生的js方式,阻止表单提交
                event.preventDefault();
                alert("事件已阻止");
            },
            // 阻止表单三的默认事件
            submitFormTwo() {
                alert("事件已阻止");
            }
        }
    });
</script>
  • 方法二是在将 $event 作为参数,传递给了 methods 里的方法,然后使用 event.preventDefault() 原生的方式来阻止提交的默认事件。
  • 方法三是直接再绑定事件时,使用 prevent 修饰符 @submit.prevent 来阻止默认事件。

23 利用事件修饰符 阻止冒泡向上执行相同事件

  • 代码
<div id="app">
    <!-- 先来看这个例子:冒泡向上执行事件 -->
    <div @click="showDiv"> <!-- 这是一个父级元素 -->
        <a href="https://www.baidu.com" @click.prevent="stopClick">点我1</a> <!-- 这是一个子元素 -->
    </div> <!-- 上面这个例子,点击a会触发 stopClick 事件 **以及 showDiv** -->

    <!-- 阻止这样的事情发生1 **stop** 不继续向上冒泡执行  -->
    <div @click="showDiv">
        <a href="https://www.baidu.com" @click.prevent.stop="stopClick">点我2</a> <!-- 这里通过链式操作,增加stop -->
    </div>

    <!-- 阻止这样的事情发生2 **self** 只有点击自己才触发 -->
    <div @click.self="showDiv" :style="{border: '1px solid'}">
        <a href="https://www.baidu.com" @click.prevent="stopClick">点我3</a> <!-- 这里通过链式操作,增加stop -->
    </div>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            // 阻止 a 跳转到百度
            stopClick() {
                alert('阻止了a默认事件')
            },
            // 父级 div 的点击事件
            showDiv() {
                alert('触发了div的点击事件');
            }
        },
    });
</script>
  • 例子中显示了JS的冒泡执行: 子元素和父元素都有点击事件,子元素触发,如果不通过一定方法阻止,那么会向上继续执行父元素的点击事件。
  • 可以通过 <子元素 @事件.stop="函数"> 来阻止向上执行。
  • 或者 <父元素 @事件.self="函数"> 来迫使只有点击父元素才执行该事件。

24 利用事件修饰符 once 绑定一次事件

  • 代码
<div id="app">
    <a href="https://www.baidu.com" @click.prevent.once="alert">点击打开百度</a>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {

        },
        methods: {
            alert() {
                alert('你将打开百度。');
            }
        }
    });
</script>
  • @click.prevent.once => 阻止默认事件、只绑定一次。
  • 再次点击即可打开百度。

25 键盘修饰符

  • 代码
<div id="app">
    <!-- @keyup 默认所有按键 -->
    <input type="text" @keyup="consoleLogSth">
    <!-- @keyup.enter 回车键才有用 -->
    <input type="text" @keyup.enter="consoleLogSth">
    <!-- 
        除此之外还有
        space tab 空格 制表符
        up down left right 方向键
        @key.ctrl, shift alt + 任意按键 
        -->
        <!-- 这是 ctrl+s (ASCII中 s = 83) -->
        <input type="text" @keyup.ctrl.83="consoleLogSth">
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
        
        },
        methods: {
            // 按键触发某些方法
            consoleLogSth() {
                console.log('触发了keyup事件');
            }
        },
    });
</script>
  • @keyup , @keyup.btn , @keyup.[ctrl|alt|shift].ASCII

26 鼠标事件修饰符

  • 代码
<div id="app">
    <!-- 
        鼠标滚轮 @click.middle
        鼠标右键比较特殊:因为浏览器中右键默认打开浏览器的右键,所以需要:
        @contextmenu调用浏览器右键事件->.prevent阻止右键默认事件->调用我们写的事件
        -->
    <div :style="style" @click.middle="showMiddle" @contextmenu.prevent="showRight"></div>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            style: {
                height: '100px',
                border: '1px solid'
            }
        },
        methods: {
            // 鼠标滚轮
            showMiddle() {
                alert('你点击了鼠标中键');
            },
            // 鼠标右键
            showRight() {
                alert('你点击了鼠标右键');
            }
        }
    });
</script>
  • @click 点击事件
  • @click.middle 滚轮点击事件
  • @contextmenu 右键点击事件(默认打开浏览器菜单) -> @contextmenu.prevent 阻止默认事件,调用我们自己写的右键事件。

27 表单控件处理 v-model

  • 代码
<div id="app">
    <!-- 使用 v-model 绑定数据 -->
    <label for="id">序号</label> <input type="number" id="id" v-model="info.id"> <br>
    <label for="name">姓名</label> <input type="text" id="name" v-model="info.name"> <br>
    <label for="age">姓名</label> <input type="number" id="age" v-model="info.age"> <br>
    <label for="desc">简介</label> 
    <!-- 文本域同样使用 v-model 绑定 -->
    <textarea id="desc" style="width: 100%" v-model="info.desc"></textarea>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            // 模拟从后台抓取的数据
            info: {
                id: 1,
                name: 'liuhaoyu',
                age: 22,
                desc: '全栈程序员', 
            }
        },
    });
</script>
  • 使用 <... v-model="数据"> 绑定数据。

28 表单处理 checkbox

  • 代码
<div id="app">
    <!-- 开关:不指定value属性,v-model绑定一个Boolean -->
    <input type="checkbox" v-model="confirmed"> 确定? {{ confirmed }}

    <div>
        <!-- 多选框:指定value属性,v-model绑定一个Array -->
        <input type="checkbox" v-model="categories" value="food"> 美食
        <input type="checkbox" v-model="categories" value="heal"> 健康
        <input type="checkbox" v-model="categories" value="trav"> 旅行
        <br>
        {{categories}}
    </div>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            confirmed: false,
            // 如果是多选,要求定义的数据必须是一个数组
            categories: [],
        },
    });
</script>
  • 不指定 value 直接使用 v-model 绑定一个布尔值,则表示该checkbox是一个“开关switch”。

  • 指定 value 并且绑定一个数组,则表示多个checkbox组成的一个多选框。

  • 在 chrome 中使用官方开发调试工具vue DevTools

    • 能翻墙,直接用谷歌浏览器的应用商店下载

    • 不能翻墙则需要 git clone https://github.com/vuejs/vue-devtools.git
    • 然后进入克隆后的项目目录,执行命令cnpm install
    • 然后打开项目目录下的 /shells/chrome/manifest.json ,编辑
    # false 改为 true
    "persistent": false
    
    • 然后编译 npm run build
    • 然后打开谷歌浏览器扩展管理 -> 选择“加载已解压的扩展程序” -> 选择 /shells/chrome 文件夹。

29 表单处理 radio

  • 代码
<div id="app">
    <input type="radio" value="male" v-model="sex"> 男 <br>
    <input type="radio" value="female" v-model="sex"> 女 <br>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            sex: 'male',
        },
    });
</script>
  • 指定 valuev-model 绑定一个具体的值即可。

30 表单处理 select

  • 代码
<div id="app">
    <!-- 这里使用 v-model 绑定数据 -->
    <select v-model="selectedCategory">
        <!-- 默认数据 -->
        <option value="">请选择</option>
        <!-- 这里使用 v-for 循环, :value="绑定属性" -->
        <option v-for="category of categories" :value="category.id"> {{ category.title }} </option>
    </select>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            categories: [
                {id: 1, title: '选项1'},
                {id: 2, title: '选项2'},
                {id: 3, title: '选项3'},
                {id: 4, title: '选项4'},
            ],
            selectedCategory: "",
        },
    });
</script>
  • 在 select 标签上绑定 v-model
  • 在 option 标签上绑定绑定属性value :value

31 表单修饰符

  • 代码
<div id="app">
    <!-- v-model.number 强制转换为 number -->
    <!-- 无论input.type是什么,表单里输入的数据,都一定是string类型的 -->
    <input type="number" v-model="age">
    <!-- 如果我非要要求数据类型是整形,在 v-model 绑定时添加 .number -->
    <input type="number" v-model.number="age">

    <!-- v.model.trim 忽略前后空格 -->
    <input type="text" v-model.trim="title">

    <!-- v.model.lay 懒更新,当输入框失焦时再更新值 -->
    <input type="text" v-model.lazy="content">
    <p><small>当前content值为:</small> {{ content }} </p>
</div>

<script>
    var app = new Vue({
        el: '#app',
        data: {
            age: 100,
            title: 'Hello World',
            content: '',
        },
        watch: {
            // 监听 age 变化
            age(newVal, oldVal) {
                console.log(typeof(newVal));
            },
            title(newVal, oldVal) {
                console.log(newVal.length);
            }
        },
    });
</script>
  • 强制将输入内容转换为整数 v-model.number
  • 强制删除输入内容前后的空格 v-model.trim
  • 懒更新,当输入框失焦时才更新绑定的数据的值 v-model.lazy (常用于数据验证等,等用户输入完,再更新该数据的值,再执行验证)。

相关文章

网友评论

      本文标题:vue 基础学习 第三天

      本文链接:https://www.haomeiwen.com/subject/qebfsftx.html