• vue03模板语法(下)


    目录

    一、事件处理器

    1.事件修饰符

     2.发送一次

    3.按键修饰符 

     二、自定义组件

      1 组件简介

      2 全局和局部组件

      3 props

    三、 组件通信

      自定义事件

    1.子传父 

    2.组件总结

    定义:template

    父传子:props

    子传父:通过$emit注册事件名

    this.$emit('事件名',....)    这里一般是json对象 

    四、 表单综合案例

     五、总结

    1.事件处理器

    2.简单组件

    3.父传子

    4.子传父

    5.综合案例表单 


    一、事件处理器

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

    1.事件修饰符

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

      .stop

      .prevent

      .capture

      .self

      .once

      

      

      

      

      

      

      

      

      

      

    ...

      

      

    ...

      

      

      注1:什么是事件冒泡?

    也就是可以这样理解为:当我点击div就会弹出div,传播到body,在到document

    解决方法:阻止冒泡

     

      

    1. html>
    2. <html>
    3. <head>
    4. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    5. <meta charset="utf-8">
    6. <title>title>
    7. <style type="text/css">
    8. .red{
    9. height: 400px;
    10. width: 400px;
    11. background-color: red;
    12. }
    13. .yellow{
    14. height: 300px;
    15. width: 300px;
    16. background-color: yellow;
    17. }
    18. .blue{
    19. height: 200px;
    20. width: 200px;
    21. background-color: blue;
    22. }
    23. .green{
    24. height: 100px;
    25. width: 100px;
    26. background-color: green;
    27. }
    28. style>
    29. head>
    30. <body>
    31. <div id="app">
    32. {{msg}}
    33. <div class="red" @click="red">
    34. <div class="yellow" @click.stop="yellow">
    35. <div class="blue" @click="blue">
    36. <div class="green" @click.stop="green">div>
    37. div>
    38. div>
    39. div>
    40. div>
    41. body>
    42. <script type="text/javascript">
    43. // 创建实例
    44. new Vue({
    45. // 挂载实例
    46. el:'#app',
    47. // 变量区
    48. data() {
    49. return {
    50. msg:'hello vue!!!'
    51. }
    52. },
    53. methods:{
    54. red(){
    55. alert('red');
    56. },
    57. yellow(){
    58. alert('yellow');
    59. },
    60. blue(){
    61. alert('blue');
    62. },
    63. green(){
    64. alert('green');
    65. }
    66. }
    67. })
    68. script>
    69. html>

     就不会传播了

     2.发送一次

    为了防止有些人,一直点击发送按钮,有可能是因为它的网络慢,或者其他,它就一直在哪里点,每点击一次就会像后台发送一次请求

    演示:

     解决方法:

     

      

    1. html>
    2. <html>
    3. <head>
    4. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p>发送一次p>
    11. <input type="text" v-model="msg" />
    12. <button v-on:click.once="dianwoshishi">点我试试button>
    13. div>
    14. body>
    15. <script type="text/javascript">
    16. // 创建实例
    17. new Vue({
    18. // 挂载实例
    19. el:'#app',
    20. // 变量区
    21. data() {
    22. return {
    23. msg:'hello vue!!!'
    24. }
    25. },
    26. methods:{
    27. dianwoshishi(){
    28. console.log(this.msg);
    29. }
    30. }
    31. })
    32. script>
    33. html>

    运行结果:

    3.按键修饰符 

     Vue允许为v-on在监听键盘事件时添加按键修饰符:

      

      

      Vue为最常用的按键提供了别名

      

      

    enter = 13  它们两是同一个意思   回车键

      全部的按键别名:

      .enter

      .tab

      .delete (捕获 "删除" 和 "退格" 键)

      .esc

      .space

      .up

      .down

      .left

      .right

      .ctrl

      .alt

      .shift

      .meta  

    1. html>
    2. <html>
    3. <head>
    4. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p>按键修饰符p>
    11. <input type="text" v-model="msg" @keyup.enter="dianwoshishi"/>
    12. div>
    13. body>
    14. <script type="text/javascript">
    15. // 创建实例
    16. new Vue({
    17. // 挂载实例
    18. el:'#app',
    19. // 变量区
    20. data() {
    21. return {
    22. msg:'hello vue!!!'
    23. }
    24. },
    25. methods:{
    26. dianwoshishi(){
    27. alert(this.msg)
    28. // console.log(this.msg);
    29. }
    30. }
    31. })
    32. script>
    33. html>

    运行结果如图所示: 

     二、自定义组件

    如果是前端框架,这个自定义组件是要深入的去了解

     vue组件

      1 组件简介

          组件(Component)是Vue最强大的功能之一

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

          组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树

      2 全局和局部组件

          全局组件:Vue.component(tagName, options),tagName为组件名,options为配置选项。

          局部组件: new Vue({el:'#d1',components:{...}})

          注册后,我们可以使用以下方式来调用组件:

          

      3 props

          props是父组件用来传递数据的一个自定义属性。

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

       注1:因为组件是可复用的 Vue 实例,所以它们与 new Vue 接收相同的选项,例如 data、computed、watch、methods

            以及生命周期钩子等。仅有的例外是像el这样根实例特有的选项。

       注2:当我们定义这个 组件时,你可能会发现它的data并不是像这样直接提供一个对象

            data: {

              count: 0

            }

            取而代之的是,一个组件的data选项必须是一个函数,因此每个实例可以维护一份被返回对象的独立的拷贝:

            data: function () {

              return {

                count: 0

              }

            }

      

        注3:定义组件名的方式有两种

             短横线分隔命名(建议使用)

             Vue.component('my-component-name', { /* ... */ }),引用方式:

             首字母大写命名

             Vue.component('MyComponentName', { /* ... */ }),引用方式: 都是可接受的   

        注4:HTML 中的特性名是大小写不敏感的,所以浏览器会把所有大写字符解释为小写字符。这意味着当你使用 DOM 中的模板时,

             camelCase (驼峰命名法) 的 prop 名需要使用其等价的 kebab-case (短横线分隔命名) 命名:

             props: ['postTitle'],

        注5:props: ['title', 'likes', 'isPublished', 'commentIds', 'author']

             希望每个 prop 都有指定的值类型

             props: {

               title: String,

               likes: Number,

               isPublished: Boolean,

               commentIds: Array,

               author: Object,

               callback: Function,

               contactsPromise: Promise // or any other constructor

    1. html>
    2. <html>
    3. <head>
    4. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p>简单组件p>
    11. <my-button>my-button>
    12. <p>父组件 传参 给 子组件p>
    13. <my-button m='zhangsan' n='3'>my-button>
    14. div>
    15. body>
    16. <script type="text/javascript">
    17. // component有两个参数,一是:自定义组件名称,二是:模板
    18. Vue.component('my-button',{
    19. // template:'',
    20. template:'',
    21. props:['m','n']
    22. })
    23. new Vue({
    24. el:'#app',
    25. data() {
    26. return {
    27. msg:'hello vue!!'
    28. }
    29. }
    30. })
    31. script>
    32. html>

     运行结果如图所示:

    三、 组件通信

      自定义事件

       监听事件:$on(eventName)

       触发事件:$emit(eventName)

       注1:Vue自定义事件是为组件间通信设计   

            vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定

         

            父Vue实例->Vue实例,通过prop传递数据

            子Vue实例->父Vue实例,通过事件传递数据

       注2:事件名

            不同于组件和prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称

            建议使用“短横线分隔命名”,例如:three-click

    1.子传父 

    子组件 将参数 传递给  父组件 的关键在于下面这两个,要满足下面的两个条件
            1.$emit    2.自定义事件
     

    this.$emit('事件名',{})

    代码块: 

    1. html>
    2. <html>
    3. <head>
    4. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. <p>子传父p>
    11. <my-button m="zhangsan" n="3" @mymethod="xxx">my-button>
    12. div>
    13. body>
    14. <script type="text/javascript">
    15. // 内部组件
    16. Vue.component('my-button',{
    17. template:'',
    18. props:['m','n'],
    19. methods:{
    20. sub(){
    21. var name = "张三";
    22. var sex = "男";
    23. var age = 22;
    24. console.log(name);
    25. console.log(sex);
    26. console.log(age);
    27. // 子组件 将参数 传递给 父组件 的关键在于
    28. // 1.$emit 2.自定义事件
    29. this.$emit('mymethod',name,sex,age);
    30. }
    31. }
    32. })
    33. // 外部组件
    34. new Vue({
    35. el:"#app",
    36. data() {
    37. return {
    38. msg:'hello vue!!!'
    39. }
    40. },
    41. methods:{
    42. xxx(a,b,c){
    43. console.log(a);
    44. console.log(b);
    45. console.log(c);
    46. }
    47. }
    48. })
    49. script>
    50. html>

     

    2.组件总结

    定义:template

    父传子:props

    子传父:通过$emit注册事件名

    this.$emit('事件名',....)    这里一般是json对象 

    四、 表单综合案例

    1. html>
    2. <html>
    3. <head>
    4. <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.10/vue.js">script>
    5. <meta charset="utf-8">
    6. <title>title>
    7. head>
    8. <body>
    9. <div id="app">
    10. 姓名:<input type="text" v-model="uname"/><br>
    11. 密码:<input type="password" v-model="pwd"/><br>
    12. 年龄:<input type="text" v-model="age"/><br>
    13. 性别:<input type="radio" name="sex" checked="checked"/>
    14. <input type="radio" name="sex"/><br>
    15. 爱好:
    16. <div v-for="l in likes">
    17. <input v-model="hobby" type="checkbox" :value="l.id"/>{{l.name}}
    18. div><br>
    19. 英语等级:
    20. <select v-model="selectedVal">
    21. <option v-for="e in englishs" :value="e.id">{{e.name}}option>
    22. select><br>
    23. <input @click="show" type="checkbox" />
    24. <input v-show="showFlag" @click="sub" type="button" value="ok" />
    25. <div>div>
    26. div>
    27. body>
    28. <script type="text/javascript">
    29. new Vue({
    30. el:'#app',
    31. data() {
    32. return {
    33. uname:null,
    34. pwd:null,
    35. age:null,
    36. sex:1,
    37. likes:[ //爱好的数据源
    38. {id:1,name:'篮球'},
    39. {id:2,name:'足球'},
    40. {id:3,name:'桌球'},
    41. {id:4,name:'乒乓球'}
    42. ],
    43. englishs:[ //英语的数据源 下拉框
    44. {id:1,name:'优'},
    45. {id:2,name:'良'},
    46. {id:3,name:'差'}
    47. ],
    48. hobby:[],//用来存放选中的爱好 比如1,3
    49. selectedVal:0,
    50. showFlag:false
    51. }
    52. },
    53. methods:{
    54. show() {
    55. this.showFlag = true;
    56. },
    57. sub(){
    58. // 后续都是json数据交互,向后台提交json对象
    59. var obj = {
    60. uname:this.uname,
    61. pwd:this.pwd,
    62. age:this.age,
    63. sex:this.sex,
    64. hobby:this.hobby,
    65. level:this.selectedVal
    66. }
    67. console.log(obj);
    68. }
    69. }
    70. })
    71. script>
    72. html>

     运行结果如图所示:

     五、总结

    1.事件处理器

    阻止冒泡和只能发送一次还有按键的修饰符等等

    阻止冒泡就是为了传播,当点击最外面一层,就不会传播,点击最里面的就会传播到最外面停止,

    就好像河里的水,当你去点击水面的时候,它就会从内传播到外,直到停止。

    发送一次指的的就是,只能向服务发送一次请求,这样就可以减少服务的压力,为了防止某人手不安分,它没反应就一直在哪里狂点。

    按键修饰符指的就是键盘的按键事件,就是不需要鼠标点击,直接用键盘回应,就好比如我们登陆,我们每登陆一个账号都会有一个确定或者注册等等,我们就可以用按键的修饰符来完成,我们就用回车键就可以直接进去登陆,不需要用鼠标移到来点击那个按钮。

    2.简单组件

    通过component里面有两个参数,一定组件名字,二是模板

    Vue.component('定义的组件名称',{

    模板:template:[标签]

    })

    3.父传子

    是要通过在模板里面写 props:['','',...] 这里面就是你父标签里面的参数,有多少放多少

    4.子传父

    子组件 将参数 传递给父组件要满足两个条件,一是$emit ,二是自定义事件

    this.$emit('自定义事件',参数)

    5.综合案例表单 

  • 相关阅读:
    第十六篇-Awesome ChatGPT Prompts-备份
    CentOS7安装Kafka_2.12-3.3.1集群及使用
    供需采购报价小程序系统
    【Tomcat专题】如何正确使用线程池
    基于虚拟机源码分析move合约(一):本地变量
    Kotlin语法入门-自定义注解(7)
    css之复合选择器
    新概念英语(第二册)复习——Lesson 11 - Lesson15
    windows batch文件中 ffmpeg 的部分小坑
    【云原生Kubernetes系列第七篇】一文掌握k8s之YAML文件(少攀谈,多沉潜,清醒而独立)
  • 原文地址:https://blog.csdn.net/weixin_67465673/article/details/126674614