• Vue_02 快速入门 基础语法02


    目录

    一、准备工作:

    二、Vue的样式绑定

    1.样式绑定:

     三、Vue的修饰符

    1. 事件修饰符

     2.按键修饰符

    四、 Vue表单标签&修饰符(基于注册案例)

    六、自定义指令

    七、组件

    1 组件简介 

    2 全局和局部组件

      3 props

    4.注意事项:

    八、自定义事件


    一、准备工作:

    首先:我们先引入vue.js,我这里用的是:2.0版本的vue.js

    如果不会使用的大家可以参考Vue的官方文档:Vue.js - 渐进式 JavaScript 框架 | Vue.js

    1. <script src="js/vue.js" type="text/javascript">script>

    二、Vue的样式绑定

    1.样式绑定:

            1.1 class绑定(已经在中定义的样式)
                  使用方式:v-bind:class="expression" 
                  expression的类型:字符串、数组、对象
          
             1.2 style绑定(属性style定义样式)
                  v-bind:style="expression"
                  expression的类型:字符串、数组、对象

    案例演示:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <style>
    9. .cl{
    10. color: red;
    11. font-weight:bold;
    12. }
    13. .cl1{
    14. font-size: 35px;
    15. }
    16. style>
    17. <body>
    18. <div id="app">
    19. <h1>{{msg}}h1>
    20. <button @click="test">有种点我button><br/>
    21. <span class="cl">牛逼轰轰span>
    22. <span style="color:blue;font-weight:600;">牛逼轰轰span>
    23. <h1>Vue方式的style和class:1.字符串、2.数组、3.对象h1>
    24. <h2>1.字符串形式:h2>
    25. <div v-bind:style="{color:color,fontSize:size+'px'}">
    26. 飞雪连天射白鹿
    27. div>
    28. <h2>2.数组形式(class绑定):h2>
    29. <div :class="cls">
    30. 笑书神侠倚碧鸳
    31. div>
    32. <h2>3.对象形式(style绑定)h2>
    33. <div :style="styleObj">
    34. 青山横北郭,白水绕东城
    35. div>
    36. <script>
    37. var flag = false;
    38. //实例化:Vue
    39. var vue = new Vue({
    40. el:"#app",//定义边界:也就是Vue的作用范围
    41. data:function(){//此处定义vue的变量
    42. return {
    43. "msg":"张三",
    44. "color":'pink',
    45. "size":'50',
    46. "cls":['cl','cl1'],//以数组的形式套样式
    47. "styleObj":{//以对象形式套样式
    48. color:'green',
    49. fontSize:"26px",
    50. fontWeight:'blod'
    51. }
    52. }
    53. },
    54. //定义方法:
    55. methods:{
    56. test:function(){
    57. console.log(123);
    58. if(!flag){
    59. this.msg="老六";
    60. flag=true;
    61. }else{
    62. this.msg="张三";
    63. flag=false;
    64. }
    65. }
    66. }
    67. });
    68. script>
    69. body>
    70. html>

    运行效果:

     三、Vue的修饰符

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

    1. 事件修饰符

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

    1. <a v-on:click.stop="doThis">a>

           .stop阻止冒泡事件案例:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>作用:阻止事件冒泡title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <body>
    9. <h1>阻止事件冒泡h1>
    10. <div @click="showMsg()" id="outSide" style="width:100px; height:100px; background:#000; padding:50px">
    11. <div @click.stop="Msg()" id="inSide" style="width:100px; height:100px; background:#CCC">div>
    12. div>
    13. <script type="text/javascript">
    14. //阻止事件冒泡后,你点击灰色盒子,整个过程只弹一次对话框了(注意与默认情况对比)
    15. var vue = new Vue({
    16. //el:定义作用域
    17. el:'#outSide',
    18. //data:专门定义v-bind/v-model/{{}}...中的属性
    19. data:function(){
    20. return{
    21. }
    22. },
    23. methods:{
    24. showMsg:function(){
    25. console.log("showMsg");
    26. },
    27. Msg:function(){
    28. console.log("Msg");
    29. }
    30. }
    31. });
    32. script>
    33. body>
    34. html>

    效果演示:

    什么是事件冒泡?(官方解释)

    答:

            在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。

            打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到中央法院,最终使你的案件得以处理。

          .prevent(一般作用于验证)

    1. <form v-on:submit.prevent="onSubmit">form>
    2. <a v-on:click.stop.prevent="doThat">a>
    3. <form v-on:submit.prevent>form>

          .capture

    1. <div v-on:click.capture="doThis">...div>

           .self

    1. <div v-on:click.self="doThat">...div>

            .once 

    1. <a v-on:click.once="doThis">a>

    部分案例演示:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h1>{{msg}}h1>
    11. <h2>示例一:h2>
    12. <h2>示例二:h2>
    13. <button @click.once="dothis()">有种点我button><br/>
    14. <h2>示例三:h2>
    15. <form action="userLogin.action" @submit.prevent="doSumbit">
    16. 账号:<input type="text" v-model="msg" />
    17. <input type="submit" value="提交"/>
    18. form>
    19. div>
    20. <script>
    21. var flag = false;
    22. //实例化:Vue
    23. var vue = new Vue({
    24. el:"#app",//定义边界:也就是Vue的作用范围
    25. data:function(){//此处定义vue的变量
    26. return {
    27. "msg":"张三",
    28. }
    29. },
    30. //定义方法:
    31. methods:{
    32. dothis:function(){
    33. console.log(123);
    34. if(!flag){
    35. this.msg="老六";
    36. flag=true;
    37. }else{
    38. this.msg="张三";
    39. flag=false;
    40. }
    41. },
    42. doSumbit:function(){
    43. console.log("doSumbit");
    44. }
    45. }
    46. });
    47. script>
    48. body>
    49. html>

     运行效果:

     2.按键修饰符

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

         
         

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

          全部的按键别名

    1.       .enter
    2.       .tab
    3.       .delete (捕获 "删除" 和 "退格" 键)
    4.       .esc
    5.       .space
    6.       .up
    7.       .down
    8.       .left
    9.       .right
    10.       .ctrl
    11.       .alt
    12.       .shift
    13.       .meta      

     案例演示(其它按键效果的与此相同):

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <input type="text" @keydown.enter="doKeyDown()" />
    11. div>
    12. <script>
    13. var flag = false;
    14. //实例化:Vue
    15. var vue = new Vue({
    16. el:"#app",//定义边界:也就是Vue的作用范围
    17. data:function(){//此处定义vue的变量
    18. return {
    19. //"msg":"张三",
    20. }
    21. },
    22. //定义方法:
    23. methods:{
    24. doKeyDown:function(){
    25. console.log("doKeyDown");
    26. }
    27. }
    28. });
    29. script>
    30. body>
    31. html>

    运行结果:

    四、 Vue表单标签&修饰符(基于注册案例)

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

           .number        使用方式如下(以下修饰符使用方式与此一致):

    账号:<input type="text" v-model.number="username" /><br/>


           将用户的输入值转为 Number 类型

           .trim
           自动过滤用户输入的首尾空格

     案例演示:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. 账号:<input type="text" v-model.number="username" /><br/>
    11. 密码:<input type="password" v-model="password" /><br/>
    12. 性别:<input type="radio" v-model="sex" value="1" />
    13. <input type="radio" v-model="sex" value="2" /><br/>
    14. 籍贯:<select v-model="areaSelected">
    15. <option value=''>---请选择---option>
    16. <option v-for="a in area" :value="a.id">
    17. {{a.name}}
    18. option>
    19. select><br/>
    20. 爱好:
    21. <span v-for="h in hobbies">
    22. <input type="checkbox" v-model="hobby" :value="h.id"/>
    23. {{h.name}}
    24. span><br/>
    25. 备注:<textarea v-model="remark">textarea><br/>
    26. <div><input type="checkbox" v-model="flag" />阅读以上内容div>
    27. <button @click="doRegister" :disabled="!flag">注册button>
    28. <script>
    29. var flag = false;
    30. //实例化:Vue
    31. var vue = new Vue({
    32. el:"#app",//定义边界:也就是Vue的作用范围
    33. data:function(){//此处定义vue的变量
    34. return {
    35. username:'',
    36. password:'',
    37. sex:'1',
    38. area:[
    39. {id:1,name:'长沙'},
    40. {id:2,name:'株洲'},
    41. {id:3,name:'湘潭'},
    42. {id:4,name:'衡阳'}
    43. ],
    44. areaSelected:'',
    45. hobbies:[
    46. {id:1,name:'听音乐'},
    47. {id:2,name:'羽毛球'},
    48. {id:3,name:'下棋'}
    49. ],
    50. hobby:[],
    51. remark:'',
    52. flag:false
    53. }
    54. },
    55. //定义方法:
    56. methods:{
    57. doRegister:function(){
    58. let params={
    59. username:this.username,
    60. password:this.password,
    61. sex:this.sex,
    62. area:this.areaSelected,
    63. hobby:this.hobby,
    64. remark:this.remark
    65. };
    66. console.log(params);
    67. }
    68. }
    69. });
    70. script>
    71. body>
    72. html>

    效果展示:

    六、自定义指令

    除了Vue自带的指令(v-on|v-model)等, Vue也允许注册自定义指令,根据作用范围又分为:

            全局指令/局部指令

    1.    Vue.directive("focus",{});//全局指令
    2.    new Vue({
    3.      el:"#d1",
    4.      directives:{//局部指令
    5.        focus:{}
    6.      }
    7.    });   

    案例演示:

    1. html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8">
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h2>局部指令h2>
    11. <div v-fos="name">
    12. div>
    13. <h2>全局指令h2>
    14. <div v-kfc="22">div>
    15. div>
    16. <script>
    17. var flag = false;
    18. /* 全局指令 :作用域更大,都可以调用到*/
    19. Vue.directive('kfc',{
    20. inserted:function(el,binding){
    21. console.log(el);
    22. console.log(binding);
    23. }
    24. })
    25. //实例化:Vue
    26. var vue = new Vue({
    27. el:"#app",//定义边界:也就是Vue的作用范围
    28. data:function(){//此处定义vue的变量
    29. return {
    30. name:'zs'
    31. }
    32. },
    33. //定义方法:
    34. methods:{
    35. },
    36. //自定义指令:仅在实例Vue里被调用
    37. directives:{
    38. fos:{
    39. inserted:function(el,binding){//钩子函数
    40. //el:打印当前所在的元素
    41. console.log(el);
    42. //打印的基本信息
    43. console.log(binding);
    44. }
    45. }
    46. }
    47. });
    48. script>
    49. body>
    50. html>

    效果展示:

      指令须知:

              指令定义函数提供了几个钩子函数用来帮助实现功能(可选)
               bind: 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作
               inserted: 被绑定元素插入父节点时调用(父节点存在即可调用,不必存在于 document 中)。
               update: 被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新(详细的钩子函数参数见下)。
               componentUpdated: 被绑定元素所在模板完成一次更新周期时调用。
               unbind: 只调用一次, 指令与元素解绑时调用。

       钩子函数的参数有:
               el: 指令所绑定的元素,可以用来直接操作 DOM 。
               binding: 一个对象,包含以下属性:
               name: 指令名,不包括 v- 前缀。
               value: 指令的绑定值, 例如: v-my-directive="1 + 1", value 的值是 2。
               oldValue: 指令绑定的前一个值,仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
               expression: 绑定值的表达式或变量名。 例如 v-my-directive="1 + 1" , expression 的值是 "1 + 1"。
               arg: 传给指令的参数。例如 v-my-directive:foo, arg 的值是 "foo"。
               modifiers: 一个包含修饰符的对象。 例如: v-my-directive.foo.bar, 修饰符对象 modifiers 的值是 { foo: true, bar: true }。
               vnode: Vue 编译生成的虚拟节点。
               oldVnode: 上一个虚拟节点,仅在 update 和 componentUpdated 钩子中可用。

    七、组件

     组件的作用:一个独立页面(组件),封装重用代码的目的,一个完整的页面由n多个组件组成。

    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这样根实例特有的选项。

    4.注意事项:

       注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. <meta charset="utf-8">
    5. <title>title>
    6. <script src="js/vue.js" type="text/javascript">script>
    7. head>
    8. <body>
    9. <div id="app">
    10. <h2>局部组件&全局组件h2>
    11. <kfc-button @three-click="doTest">kfc-button>
    12. <ff-button :firstName="name">ff-button>
    13. div>
    14. <script>
    15. var flag = false;
    16. /* 全局组件 :作用域更大,都可以调用到*/
    17. Vue.component('ff-button',{
    18. //有且只有一个根节点
    19. //有可能template是一个表格
    20. template:"

      [全局组件]

      "
      ,
    21. props:['firstName'],
    22. //在自定义组件中请使用函数方法
    23. data:function(){
    24. return{
    25. count:0
    26. }
    27. },
    28. methods:{
    29. doClick:function(){
    30. console.log("全局组件:从父到子传过来的属性值:"+this.firstName);
    31. this.count++;
    32. }
    33. }
    34. });
    35. //实例化:Vue
    36. //组件的定义:
    37. //1)全局组件:Vue.component(组件名称,配置选项)
    38. //2)局部组件:new Vue({...,components{...}})
    39. //全局组件和局部组件的父组件都是new Vue();Vue实例
    40. //组件的命名:
    41. //1)短横线命名法:kfc-button
    42. //2)首字符大写命名法(帕斯卡):KfcButton
    43. //什么是驼峰命名法:kfcButton
    44. //组件之间的传参
    45. //1)父到子:采用props属性方式传递参数,允许传递基本类型、对象及动态值(类似:一瓶水,我们需要往里面注入一些东西,我们就需要打开盖子(开个孔(入口)))
    46. //2)子到父:采用事件方式传递参数,$emit
    47. var vue = new Vue({
    48. el:"#app",//定义边界:也就是Vue的作用范围
    49. data:function(){//此处定义vue的变量
    50. return {
    51. name:'zs'
    52. }
    53. },
    54. //定义方法:
    55. methods:{
    56. doTest:function(c){
    57. console.log("从子到父传过来的属性值:"+c);
    58. }
    59. },
    60. //局部组件
    61. components:{
    62. 'kfc-button':{
    63. //有且只有一个根节点
    64. //有可能template是一个表格
    65. /* template:"

      [局部组件]

      ", */
    66. /* 子传父形式 */
    67. template:"

      [局部组件]

      "
      ,
    68. props:['firstName'],
    69. //在自定义组件中请使用函数方法
    70. data:function(){
    71. return{
    72. count:0
    73. }
    74. },
    75. methods:{
    76. doClick:function(){
    77. this.count++;
    78. },
    79. //子到父测试
    80. doThreeClick:function(){
    81. this.count++;
    82. if(this.count%3==0){
    83. console.log("局部组件:从父到子传过来的属性值:"+this.firstName);
    84. console.log("[局部组件]count=%s",this.count);
    85. //将事件传过去
    86. this.$emit('three-click',this.count);
    87. }
    88. }
    89. }
    90. }
    91. }
    92. });
    93. script>
    94. body>
    95. html>

    效果展示:

     

    组件文件:.vue   后缀结尾

    形式例如:

    1. <template>
    2. template>
    3. <script>
    4. /* 自定义组件js代码存放
    5. 作用范围:仅在当前Vue实例(当前组件内有效)
    6. 例如:
    7. data:function(){
    8. return{
    9. count:0
    10. }
    11. },
    12. methods:{
    13. doClick:function(){
    14. this.count++;
    15. }
    16. }
    17. */
    18. script>
    19. <style>
    20. /* 组件样式 */
    21. style>

    组件传值作用:用于主页面左侧菜单折叠的参数传递 

    八、自定义事件

      监听事件:$on(eventName) 
       触发事件:$emit(eventName) 

       注1:Vue自定义事件是为组件间通信设计   
            vue中父组件通过prop传递数据给子组件,而想要将子组件的数据传递给父组件,则可以通过自定义事件的绑定
         
            父Vue实例->Vue实例,通过prop传递数据
            子Vue实例->父Vue实例,通过事件传递数据 

       注2:事件名
            不同于组件和prop,事件名不存在任何自动化的大小写转换。而是触发的事件名需要完全匹配监听这个事件所用的名称
            建议使用“短横线分隔命名”,例如:three-click

     

    # 只配合一个事件名使用 $emit:

    1. <div id="emit-example-simple">
    2.   <welcome-button v-on:welcome="sayHi">welcome-button>
    3. div>
    4. <script>
    5. Vue.component('welcome-button', {
    6.   template: `
    7.    
    8.       Click me to be welcomed
    9.    
    10.     `
    11. })
    12. new Vue({
    13.   el: '#emit-example-simple',
    14.   methods: {
    15.     sayHi: function () {
    16.       alert('Hi!')
    17.     }
    18.   }
    19. })
    20. script>


    # 配合额外的参数使用 $emit: 

    1.   <div id="app">        
    2.         <div id="counter-event-example">
    3.         
    4.             <magic-eight-ball v-on:give-advice="showAdvice">welcome-button>
    5.         div>
    6.     div>
    7.  
    8.     <script>
    9.     Vue.component("magic-eight-ball", {
    10.         data:function(){
    11.             return{
    12.                 possibleAdvice:["Yes","No","Maybe"]
    13.             }
    14.         },
    15.         methods:{
    16.             giveAdvice:function(){
    17.                 var randomAdviceIndex=Math.floor(Math.random()*this.possibleAdvice.length)
    18.                 this.$emit('give-advice',this.possibleAdvice[randomAdviceIndex])
    19.             }
    20.         },
    21.         template: `
    22.             
    23.                 Click me to for advice
    24.             
    25.         `
    26.     });
    27.     new Vue({
    28.         el: '#counter-event-example',        
    29.         methods: {
    30.             showAdvice: function (advice) {
    31.                 alert(advice)
    32.             }  
    33.         }
    34.     })
    35.     script>
    36. 数据传递
    37. <div id="app">        
    38.       <parent>parent>
    39.     div
    40.     <script>
    41.       //定义局部子组件
    42.       var childNode={
    43.         template:`
    44.           <div class="child">
    45.             <div>
    46.               <span>子组件数据span>
    47.               <input v-model="childMsg" v-on:input="data">
    48.             div>
    49.             <p>{{childMsg}}p>
    50.           div>
    51.         `,
    52.         data(){
    53.           return {
    54.             childMsg:"我不猜"
    55.           }
    56.         },
    57.         methods:{
    58.           data(){
    59.             this.$emit('pass-data',this.childMsg)
    60.           }
    61.         }
    62.       }
    63.       //定义父组件
    64.       var parentNode={
    65.         template:`
    66.           <div class="parent">
    67.             <div>
    68.               <span>父组件数据span>
    69.               <input v-model="msg">
    70.             div>
    71.             <p>{{msg}}p>
    72.             <child v-on:pass-data="getData">child>
    73.           div>
    74.         `,
    75.         components:{
    76.           'child':childNode
    77.         },
    78.         data(){
    79.           return {
    80.             msg:"你猜"
    81.           }
    82.         },
    83.         methods:{
    84.           getData(value){
    85.             this.msg=value;
    86.           }
    87.         }
    88.       }
    89.       new Vue({
    90.         el: '#app',        
    91.         components:{
    92.           'parent':parentNode
    93.         }
    94.       })
    95.     script>

    效果演示:

    子组件通过数据绑定将自身的信息传递给父组件,从而改变父组件内容。

    注:

    现在在组件上使用 v-on 只会监听自定义事件 (组件用 $emit 触发的事件)。如果要监听根元素的原生事件,可以使用 .native 修饰符,比如:

    <my-component v-on:click.native="doSomething">my-component>

  • 相关阅读:
    创建vue3项目、链式调用、setup函数、ref函数、reactive函数、计算和监听属性、vue3的生命周期、torefs的使用、vue3的setup写法
    Windows命令行查找并kill进程及常用批处理命令汇总
    从零上手双指针
    电磁仿真CST软件探针的设置和使用交叠检查功能【基础教程】
    STM32F4串口USART发送为00的解决方案
    @RequestMapping 注解以及其它使用方式
    【设计模式 05】原型模式
    软件测试项目实战,一比一还原可以写进简历的
    (十三) minAreaRect函数
    化学之理财之道
  • 原文地址:https://blog.csdn.net/m0_60786924/article/details/126471187