Vue——05-02组件的数据、为什么data要使用函数、父组件给子组件传递数据的三种写法、父传子以及传两种以上的值、默认值以及父传子的引用类型

简介: 组件的数据、为什么data要使用函数、父组件给子组件传递数据的三种写法、父传子以及传两种以上的值、默认值以及父传子的引用类型

在组件中获取数据

看下面这个例子:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>组件数据的获取</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1></cpn1>
  </div>
  <script type="text/javascript">
    const vm = new Vue({
    el: '#app',
    components: {
      cpn1: {
      template: `<div>{{msg}}</div>`,
      data() {
        return {
        msg: 'Nanchen'
        }
      },
      }
    }
    })
  </script>
  </body>
</html>

打印结果:

543ba7c0b7844100830324957ae08b75.png

在局部组件中添加cpn1标签并且在添加data组件

二、组件中的data为什么必须要是函数?

这里看个例子:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>data必须是函数</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  <style type="text/css">
    h2{
    display: inline-block;
    }
    button{
    width: 35px;
    height: 35px;
    line-height: 35px;
    }
  </style>
  </head>
  <body>
  <div id="app">
    <h2>data不使用函数时:</h2>
    <cpn1></cpn1>
    <cpn1></cpn1>
    <hr>
    <h2>data使用函数时:</h2>
    <cpn2></cpn2>
    <cpn2></cpn2>
    <hr>
  </div>
  <template id="cpn1">
    <div>
    <button @click="message--">-</button>
    <h2>{{message}}</h2>
    <button @click="message++">+</button>
    </div>
  </template>
  <template id="cpn2">
    <div>
    <button @click="message--">-</button>
    <h2>{{message}}</h2>
    <button @click="message++">+</button>
    </div>
  </template>
  <script type="text/javascript">
    const obj = {
    message: 0
    };
    const vm = new Vue({
    el: '#app',
    components: {
      cpn1: {
      template: '#cpn1',
      data() {
        return obj
      }
      },
      cpn2: {
      template: '#cpn2',
      data() {
        return {
        message: 0
        }
      }
      }
    }
    })
  </script>
  </body>
</html>

实现效果:

a1013ebc18684e2c8050411d4a02991e.gif

可以看到,如果这个例子的return直接返回这个obj,那么上下的+-会同时进行

如果在data中使用函数时,它不会进行联动。显而易见,第二种使用函数的这个具有独立性,用起来更方便

简单的来说:如果 data 直接是一个对象的话,那么一旦修改其中一个组件的数据,其他组件相同数据就会被改变,而 data 是函数的话,每个 vue 组件的 data 都因为函数有了自己的作用域,互不干扰。

也可以这样理解:data没使用函数时把数据放在了栈内存中,data使用函数时把数据放在堆内存里

18f2b4b1bfc7484e8681a35c6e7f39ab.png

父组件给子组件传递数据——props属性

使用props属性,父组件向子组件传递数据

props数组写法:

props: ['cmovies', 'cmessage']

对象写法:

props: { 
          cmessage: {
          type: String,                     // 类型限制
          default: 'zzzzz',                // 默认值
          required: true                 //在使用组件必传值
          }
  }

如果其中的类型是Object或者为Array类型,其默认值必须是一个函数

第一种写法:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>父组件给子组件传递数据</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="message"></cpn1>
  </div>
  <template id="cpn1">
    <div>I·am {{aaa}}</div>
  </template>
  <script type="text/javascript">
    const vm = new Vue({
    el:'#app',
    data(){
      return{
      message:'NanChen'
      }
    },
    components:{
      cpn1:{
      template:'#cpn1',
      data(){
        return{
        aaa:this.msg
        }
      },
      props:['msg']    //数组写法
      }
    }
    })
  </script>
  </body>
</html>

效果如下:

8b18e05a371746f88183d15d4ddf8a12.png

第二种写法:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>第二种写法</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="message"></cpn1>
  </div>
  <script type="text/javascript">
    Vue.component('cpn1', {
    template: `<div>My name is{{msg}}</div>`,
    props: {
      msg: {
      type: String
      }
    }
    })
    const vm = new Vue({
    el: '#app',
    data() {
      return {
      message: ' NanChen'
      }
    },
    })
  </script>
  </body>
</html>

效果如下:

5a712904eb764923bf08b08df935adef.png

第三种写法:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>第三种方法</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="message"></cpn1>
  </div>
  <script type="text/javascript">
    const vm = new Vue({
    el: '#app',
    data() {
      return {
      message: ' NanChen'
      }
    },
    components: {
      cpn1: {
      template: `<div>My name is{{msg}}</div>`,
      props: {
        msg: {
        type: String
        }
      }
      }
    }
    })
  </script>
  </body>
</html>

效果如下:

15d5af1338a64000b265b9b4cc777816.png

当然方法还有很多,这里就不一一举例了。

下面演示一下如果父组件传两个及以上的写法:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="message" :one="first"></cpn1>
  </div>
  <script type="text/javascript">
    const vm = new Vue({
    el:'#app',
    data(){
      return{
      message:'Welcome to',
      first:" Nanchen's blog"
      }
    },
    components:{
      cpn1:{
      template:
      `<div>Hello everyone,{{msg}}——{{one}}</div>`,
      props:{
        msg:{
        type:String
        },
        one:{
        type:String
        }
      }
      },
    }
    })
  </script>
  </body>
</html>

效果如下:

def4af5a21744837a988706674566d23.png

传默认值 :

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="message" ></cpn1> <!--:num="nums"-->
  </div>
  <script type="text/javascript">
    const vm = new Vue({
    el:'#app',
    data(){
      return{
      message:"My name is NanChen",
      // nums:"I'm 50 years old"
      }
    },
    methods:{
    },
    components:{
      cpn1:{
      template:
      `<div>{{msg}}--{{num}}</div>`,
      props:{
        msg:{
        type:String
        },
        num:{
        type:String,
        default:'欢迎来到Nanchen的博客',    // 如果上方没有nums值就会显示默认值里的文字
        required:true //可以使用required选项来声明这个参数是否必须传入。
        }
      }
      }
    }
    })
  </script>
  </body>
</html>

3e4711cd00ad4a9eb410b9ec05a34b58.png

required:声明这个参数是否必须传入。

父组件传子组件数据——引用类型的两种写法

第一种:数组与对象的写法

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title></title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="message1"></cpn1>
    <cpn2 :msgs="message2"></cpn2>
  </div>
  <script type="text/javascript">
    const vm = new Vue({
    el:'#app',
    data(){
      return{
      message1:['Nan','Chen'],
      message2:{
        name:'NanChen',
        age:39,
        sex:'unknown',
      },
    }
    },
    components:{
      cpn1:{
      template:
      `<div>这是一个数组,其包含:{{msg}}</div>`,
      props:{
        msg:{
        type:Array,
        },
      }
      },
      cpn2:{
      template:
      `<div>My name is {{msgs.name}} I'm {{msgs.age}} years old</div>`,
      props:{
        msgs:{
        type:Object
        }
      }
      }
    },
    })
  </script>
  </body>
</html>

效果如下图:

817504a188454fcbab0c43b9737f4a2a.png

第二种Function类型:

<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>父传子引用类型</title>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  </head>
  <body>
  <div id="app">
    <cpn1 :msg="add"></cpn1>
    <h2>{{count}}</h2>
  </div>
  <script type="text/javascript">
    const vm = new Vue({
    el:'#app',
    data:{
      count:0
    },
    methods:{
      add:function(){
      return this.count++;
      }
    },
    components:{
      cpn1:{
      template:
      `<div>
        <button @click="sum">+</button>
      </div>`,
      props:{
        msg:{
        type:Function // 引用类型
        },
      },
      methods:{
        sum(){
        this.msg()
        }
      }
      }
    }
    })
  </script>
  </body>
</html>

效果:

cecd581b658840d386103eeaee052986.gif



相关实践学习
Serverless极速搭建Hexo博客
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
25天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
22天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
126 64
|
1天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
22天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
28 8
|
22天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
25天前
|
JavaScript 前端开发 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
27天前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
28天前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
32 1
vue学习第一章
|
28天前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
26 1
vue学习第三章
|
28天前
|
缓存 JavaScript 前端开发
vue学习第四章
欢迎来到我的博客!我是瑞雨溪,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中计算属性的基本与复杂使用、setter/getter、与methods的对比及与侦听器的总结。如果你觉得有用,请关注我,将持续更新更多优质内容!🎉🎉🎉
35 1
vue学习第四章