• Vue.js3学习篇--Vue组件的属性和方法


    目录

    一.属性和方法

    1.属性基础

    2.方法基础

    二.计算属性和侦听器

    1.计算属性

    2.计算属性和函数的选择

    3.计算属性的赋值

    4.属性侦听

    三.函数限流

    四.表单数据的双向绑定

    1.文本输入框

    2.多行文本输入域

    3.复选框和单选框

    4.选择列表

       5.两个常用修饰符

         五.样式绑定

    1.为HTML标签绑定class属性        

    2.绑定内联样式

    六.实战


    一.属性和方法
    1.属性基础

            在编写Vue组件时,组件的数据都放在data选项中,Vue组件的data选项是一个函数,该函数返回一些我们定义属性的数据

    例如:

    2.方法基础

            组件的方法定义在methods选项中,在我们实现组件的方法时,可以放心地使用this关键字,Vue组件会自动将其绑定到当前组件实例本身

    例如定义一个方法:

    1. methods:{
    2. addation(){
    3. this.count++
    4. }
    5. }

    二.计算属性和侦听器

            大多数情况下,Vue组件中定义的属性数据组件都可以直接渲染到HTML元素,但是有写情况属性中的数据并不适合直接渲染,需要经过处理后再渲染,在Vue中,就可以使用计算机属性或侦听器来实现这种逻辑

    1.计算属性

            之前的data函数中定义的属性是存储属性,存储属性的值是我们直接定义好的,这个属性只起到存储数据的作用。在Vue中还有一种计算属性,它不是用来存储数据,而是通过一些计算逻辑来实时地维护当前属性的值,计算属性在compute选项中定义。

    例如:定义一个组件的type属性,当组件的count属性大于4时,type属性值为牛逼,否则为不牛逼

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="Application">
    10. <div>{{count}}div>
    11. <div>{{type}}div>
    12. <button @click="addation">累加button>
    13. div>
    14. <script>
    15. const App={
    16. data(){
    17. return{
    18. count:0,
    19. }
    20. },
    21. methods:{
    22. addation(){
    23. this.count++
    24. }
    25. },
    26. computed:{
    27. type(){
    28. return this.count>4?"牛逼":"不牛逼"
    29. }
    30. },
    31. }
    32. let instance=Vue.createApp(App).mount("#Application")
    33. console.log(instance.count)
    34. console.log(instance.$data.count)
    35. script>
    36. body>
    37. html>

    计算属性效果:

                    

    2.计算属性和函数的选择

            上面的代码实现我们也可以通过函数来实现,函数定义为:

    1. methods:{
    2. addation(){
    3. this.count++
    4. },
    5. type(){
    6. return this.count>4?"牛逼":"不牛逼"
    7. }
    8. }

    插值变量定义为函数:

    <div>{{type()}}div>

            从运行的结果来说,使用函数和使用计算属性的结果一样,但实际上,计算属性是基于存储属性的值的变化而重新计算的,计算完成后,其结果会被缓存,下次访问计算属性时,只要依赖的属性没有变化,其内的逻辑代码不会被重复执行,而函数不一样,每次访问都会重新执行函数内的代码才可以得到结果。所以,在实际开发中,我们可以根据是否需要缓存这个标准来选择使用计算属性还是函数

    3.计算属性的赋值

            存储属性主要用于数据的存储,通常情况下,计算属性只用来取值,不会存值,这个取值的方法我们称为get方法,但存值的方法我们可以自己实现,称为set方法。

    例如:

    1. computed:{
    2. type:{
    3. //get方法取值
    4. get(){
    5. return this.count > 4?"牛逼":"不牛逼"
    6. },
    7. //set方法存值
    8. set(newValue){
    9. if (newVue=="牛逼"){
    10. this.count=5
    11. }else {
    12. this.count=0
    13. }
    14. }
    15. }
    16. }

    即可通过get和set方法实现计算属性的存取值功能

    4.属性侦听

            属性侦听是Vue非常强大的功能之一,使用属性侦听可以方便地监听某个属性的变化。在Vue组件中可以通过watch选项来定义属性侦听器。Vue侦听器提供的了两种语法的定义格式,分别是方法格式和对象格式

    1.方法格式

    1. //侦听器定义在watch中,监听哪个数据,就把哪个数据当函数名
    2. watch:{
    3. watchname(oldvalue,newvalue){
    4. //语句
    5. }
    6. }

    方法格式侦听器的缺点:

    (1)首次进入浏览器的时候,无法立即触发一次侦听器

    (2)如果侦听的是一个对象,对象里的数据发生了变化,并不会触发侦听器

    2.对象格式

    1. //侦听器定义在watch中,监听哪个数据,就把哪个数据当函数名
    2. watch:{
    3. watchname(oldvalue,newvalue){
    4. //语句
    5. },
    6. //可以通过immediate控制侦听器自动触发一次,默认为false
    7. immediate:true
    8. //深度监听
    9. depp:true
    10. }

    对象格式的缺点:

    (1)可以通过immediate属性控制侦听器自动触发一次,当默认是false的

    (2)不能监听到每一个属性的变化,除非设置deep属性

    例如:

            在页面输入框中输入字符,如果超过10个字符弹出警告

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="Application">
    10. <input v-model="searchText"/>
    11. div>
    12. <script>
    13. const App={
    14. data(){
    15. return{
    16. searchText:""
    17. }
    18. },
    19. watch:{
    20. searchText(oldValue,newValue){
    21. if (newValue.length>10){
    22. alert("文本过长")
    23. }
    24. }
    25. }
    26. }
    27. let instance=Vue.createApp(App).mount("#Application")
    28. script>
    29. body>
    30. html>

    效果:


    三.函数限流

            函数限流是指根据时间间隔,在指定时间间隔内不允许重复执行同一个函数,可以使用setTimeout函数来控制时间

    例:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="Application">
    10. <button @click="click">按钮button>
    11. div>
    12. <script>
    13. const App={
    14. data(){
    15. return{
    16. throttle:false
    17. }
    18. },
    19. methods:{
    20. click() {
    21. if (!this.throttle){
    22. console.log(Date())
    23. }else {
    24. return
    25. }
    26. this.throttle=true
    27. setTimeout(()=>{
    28. this.throttle=false
    29. },2000);
    30. },
    31. }
    32. }
    33. Vue.createApp(App).mount("#Application")
    34. script>
    35. body>
    36. html>

            还有就是使用Lodash库进行函数限流。Lodash是一款高性能的JavaScript实用工具库,它提供了debounce函数来进行方法的调用限流,在使用前要先导入Lodash库:

    上面的代码可以改为:

    1. methods:{
    2. click:_.debounce(function () {
    3. console.log(Date())
    4. },200)
    5. }

    四.表单数据的双向绑定

            双向绑定是Vue中处理用户交互的一种方式,文本输入框,多行文本输入域,单选框与多选框等都可以进行数据的双向绑定

    1.文本输入框

            文本输入框的数据的绑定直接使用v-model指令设置就可以了,例:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="Application">
    10. <input v-model="textfileld">
    11. <p>文本输入框内容:{{textfileld}}p>
    12. div>
    13. <script>
    14. const App={
    15. data(){
    16. return{
    17. textfileld:""
    18. }
    19. }
    20. }
    21. Vue.createApp(App).mount("#Application")
    22. script>
    23. body>
    24. html>

    渲染效果:

    2.多行文本输入域

            多行文本可以使用textarea标签来实现,该标签支持换行和设置输出行数,绑定方式和input一样,如:

    1. <textarea v-model="textarea">textarea>
    2. <p style="white-space: pre-line">多行文本:{{textarea}}p>

    效果:

            需要注意的是textarea元素只能通过v-model指令的方式来设置内容,不能直接在标签内插入文本,如下是错误的:

        <textarea v-modl="textarea">{{textarea}}textarea>
    
    3.复选框和单选框

            复选框input标签的类型为checkbox,单选框为radio,例:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="Application">
    10. <input type="checkbox" value="python" v-model="box">python
    11. <input type="checkbox" value="java" v-model="box">java
    12. <input type="checkbox" value="c++" v-model="box">c++
    13. <p>{{box}}p>
    14. <input type="radio" value="man" v-model="box_1">man
    15. <input type="radio" value="woman" v-model="box_1">woman
    16. <p>{{box_1}}p>
    17. div>
    18. <script>
    19. var App={
    20. data(){
    21. return{
    22. box:[],
    23. box_1:""
    24. }
    25. }
    26. }
    27. Vue.createApp(App).mount("#Application")
    28. script>
    29. body>
    30. html>

    效果:

    4.选择列表

            选择列表提供一组选项进行选择,可以单选也可以多选,标签为select,其内的option标签用来定义选项,如果想多选,主要添加上multiple属性即可

    例:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="select">
    10. <select v-model="select" multiple>
    11. <option>Vueoption>
    12. <option>Reactoption>
    13. <option>Nodeoption>
    14. select>
    15. <p>{{select}}p>
    16. div>
    17. <script>
    18. var App={
    19. data(){
    20. return{
    21. select:''
    22. }
    23. }
    24. }
    25. Vue.createApp(App).mount("#select")
    26. script>
    27. body>
    28. html>

    图:ctrl键全选

       5.两个常用修饰符

            对表单进行数据绑定时,可以使用修饰符来控制绑定指令的行为,较常用的修饰符有lazy和trim。修饰符lazy的作用类似于属性的懒加载,当数据变化后不会第一时间去同步属性的值,当失去焦点后才同步,修饰符trim作用是将绑定的文本数据到首位空格去掉

    代码展示:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="test">
    10. <input v-model.lazy="text">
    11. <p>懒加载:{{text}}p>
    12. <input v-model.trim="text1">
    13. <p>懒加载:{{text1}}p>
    14. div>
    15. <script>
    16. var App={
    17. data(){
    18. return{
    19. text:"",
    20. text1:""
    21. }
    22. }
    23. }
    24. Vue.createApp(App).mount("#test")
    25. script>
    26. body>
    27. html>

    效果:


         五.样式绑定

            html可以通过class属性,id属性或标签绑定CSS样式,同样也可以用Vue绑定

    1.为HTML标签绑定class属性        

            v-bind指令可以直接对class属性进行数据绑定,但如果绑定的值是一个对象,其就会产生一个新的语法规则,设置的对象中可以指定对应的class样式是否被选用

    码:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. <style>
    8. .red{
    9. color: red;
    10. }
    11. .blue{
    12. color: blue;
    13. }
    14. style>
    15. head>
    16. <body>
    17. <div id="test">
    18. <div :class="{blue:isblue,red:isred}">
    19. <p>国庆快乐!p>
    20. div>
    21. div>
    22. <script>
    23. var App={
    24. data(){
    25. return{
    26. isblue:true,
    27. isred:false
    28. }
    29. }
    30. }
    31. Vue.createApp(App).mount("#test")
    32. script>
    33. body>
    34. html>

    div元素的class属性会根据isblue和isred的属性值真假来改变,但class绑定的属性不会冲突,如果它们都为true,那就都会添加到class属性中

            也可以使用数组对象控制class属性:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. head>
    8. <body>
    9. <div id="test">
    10. <div :class="[colorclass,fontclass]">
    11. <p>国庆快乐!p>
    12. div>
    13. div>
    14. <script>
    15. var App={
    16. data(){
    17. return{
    18. colorclass:'blue',
    19. fontclass:'font'
    20. }
    21. }
    22. }
    23. Vue.createApp(App).mount("#test")
    24. script>
    25. body>
    26. html>
    2.绑定内联样式

            内联样式时指直接通过HTML元素的style属性来设置样式,如将上面代码改动几处;

    HTML元素:

    1. <div :style="{color:textcolor,fontSize:textfont}">
    2. <p>国庆快乐!p>
    3. div>

    Vue组件:

    1. var App={
    2. data(){
    3. return{
    4. textcolor:'blue',
    5. textfont:'font'
    6. }
    7. }
    8. }
    9. Vue.createApp(App).mount("#test")

            这样,我们就通过了设置style属性来设置class属性,但需要注意的是,内联设置的CSS和外部定义的CSS有一点区别,外部的多用“-”符号连接,如font-Size,而内联样式常用驼峰命名法,如fontSize


    六.实战

            完成一个功能完整的用户注册界面,并通过一些简单的CSS样式构造页面布局

    看码:

    1. !DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <title>Titletitle>
    6. <script src="https://unpkg.com/vue@next">script>
    7. <style>
    8. .container{
    9. margin: 70px auto 0;
    10. text-align: center;
    11. width: 300px;
    12. }
    13. .subTitle{
    14. color:gray;
    15. font-size: 14px;
    16. }
    17. .title{
    18. font-size: 45px;
    19. }
    20. .input{
    21. width: 90%;
    22. }
    23. .inputContainer{
    24. text-align: left;
    25. margin-bottom: 20px;
    26. }
    27. .subContainer{
    28. text-align: left;
    29. }
    30. .field{
    31. font-size: 14px;
    32. }
    33. .input{
    34. border-radius: 6px;
    35. height: 25px;
    36. margin-top: 10px;
    37. border-color: cornsilk;
    38. }
    39. .tip{
    40. margin-top: 5px;
    41. font-size: 12px;
    42. color: gray;
    43. }
    44. .setting{
    45. font-size: 9px;
    46. color: black;
    47. }
    48. .label{
    49. font-size: 12px;
    50. margin-left: 5px;
    51. height: 20px;
    52. vertical-align: middle;
    53. }
    54. .checkbox{
    55. height: 20px;
    56. vertical-align: middle;
    57. }
    58. .btn{
    59. border-radius: 10px;
    60. height: 40px;
    61. width: 300px;
    62. margin-top: 30px;
    63. background-color: deepskyblue;
    64. border-color: blue;
    65. color: white;
    66. }
    67. style>
    68. head>
    69. <body>
    70. <div class="container" id="Application">
    71. <div class="container">
    72. <div class="subTitle">加入我们div>
    73. <h1 class="title">创建你的账号h1>
    74. <div v-for="(item,index) in fields" class="inputContainer">
    75. <div class="field">{{item.title}}<span v-if="item.required" style="color: #FF0000">*span>div>
    76. <input class="input" v-model="item.model" :type="item.type"/>
    77. <div class="tip" v-if="index===2">请输入大于6位的密码div>
    78. div>
    79. <div class="subContainer">
    80. <div class="setting">偏好设置div>
    81. <input v-model="receiveMsg" class="checkbox" type="checkbox"><label class="label">接收更新邮件label>
    82. div>
    83. <button @click="createAccount" class="btn">创建账号button>
    84. div>
    85. div>
    86. <script>
    87. const App={
    88. data(){
    89. return{
    90. fields:[
    91. {
    92. title:" 用户名",
    93. required:true,
    94. type:"text",
    95. model:""
    96. },{
    97. title:" 邮箱地址",
    98. required: false,
    99. type: "text",
    100. model:""
    101. },{
    102. title:"密码",
    103. required: true,
    104. type:"password",
    105. model:""
    106. }
    107. ],
    108. receiveMsg:false
    109. }
    110. },
    111. computed:{
    112. name:{
    113. get(){
    114. return this.fields[0].model
    115. },
    116. set(value){
    117. this.fields[0].model=value
    118. }
    119. },
    120. email:{
    121. get(){
    122. return this.fields[1].model
    123. },
    124. set(value){
    125. this.fields[1].model=value
    126. }
    127. },
    128. password:{
    129. get(){
    130. return this.fields[2].model
    131. },
    132. set(value){
    133. this.fields[2].model=value
    134. }
    135. }
    136. },
    137. methods:{
    138. emailCheck(){
    139. var verify=/^\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/;
    140. if(!verify.test(this.email)){
    141. return false
    142. }else {
    143. return true
    144. }
    145. },
    146. createAccount(){
    147. if(this.name.length===0){
    148. alert("请输入用户名")
    149. return
    150. }else if(this.password.length<=6){
    151. alert("密码输入需要大于6位")
    152. return
    153. }else if(this.email.length>0&&!this.emailCheck(this.email)){
    154. alert("请输入正确的邮箱")
    155. return
    156. }
    157. alert("注册成功!")
    158. console.log('name:${this.name}\npassword:${this.password}\nemail:${this.email}' +
    159. '\nreceiveMsg:${this.receiveMsg}')
    160. }
    161. }
    162. }
    163. Vue.createApp(App).mount("#Application")
    164. script>
    165. body>
    166. html>

            

  • 相关阅读:
    Armv9 Cortex-A720的L2 memory system 和 L2 Cache
    2023年了,为何 Selenium 依然这么火?
    计算机二级(Python)真题讲解每日一题:《字典字符查找》
    uniapp中H5使用Vconsole调试
    ipv6地址概述——带你了解ipv6与ipv4的不同
    LeetCode54题:螺旋矩阵(python3)
    深信服技术认证“SCSA-S”划重点:渗透测试工具使用
    RDD编程进阶自定义累加器_大数据培训
    【Java面试】HashMap死循环问题
    Java 筆記
  • 原文地址:https://blog.csdn.net/weixin_63009369/article/details/133490728