组件可以有自己的data数据
组件中的data必须是一个方法,这样方法内部还必须返回一个对象才行
vue提供了两种方案来定义HTML模块内容:
使用<script>标签
使用<template>标签
// 方式一<template id="tmp"> <div> <h1>212</h1> <h2>{{msg}}</h2> // 无法访问data中的msg,会报错</div></template>// 方式二<script type="text/x-template" id="tmp"> <div> <h1>212</h1> <h2>{{msg}}</h2>// 无法访问data中的msg,会报错 </div></script><script> var vm = new Vue({ el: "#app", data: { msg: "小七", }, components:{ 'my-com':{ template:'#tmp' } } });</script>
答案:不能,Vue组件应该有自己保存数据的地方。
组件是一个单独功能模块的封装,这个模块有属于自己的HTML模板,也应该有属于自己的数据data
组件中的数据是保存在哪里呢?顶层的Vue实例中吗?
组件对象也有一个data属性
只是这个data属性必须是一个函数
这个函数返回一个对象,对象内部保存着数据
八、为什么组件data必须是函数
根实例对象data可以是对象也可以是函数(根实例是单例),不会产生数据污染情况
组件实例对象data必须为函数,目的是为了防止多个组件实例对象之间共用一个data,产生数据污染
对象为引用关系,当复用组件时,由于数据对象都指向同一个data对象,当在一个组件中修改data时,其他重用的组件中的data会同时被修改,但是使用返回的对象的函数,由于每次返回的都是一个新对象,保障了引用地址不同,则不会出现修改同一个数据的问题
js只有函数构成作用域(注意理解作用域,只有函数的{}构成作用域,对象的{}以及if(){}够不构成作用域),data是一个函数时,每个组件实例都有自己的作用域,每个实例相互独立,不会相互影响
<body> <div id="app"> <!-- counter是独立的,互不影响 --> <cpn></cpn> <!-- counter独立的 --> <cpn></cpn> </div> <template id="tmp"> <div> <p>{{counter}}</p> <button @click="counter++">+</button> <button @click="counter--">-</button> </div> </template> </body> <script> Vue.component("cpn", { template: "#tmp", data() { return { counter: 0, } }, }) var vm = new Vue({ el: "#app", data: {}, })</script>
子组件是不能直接访问父组件或者Vue实例数据的。那么如何把父组件的数据传递给子组件?通过props向子组件传递数据,首先说下props基本用法:
在子组件中,使用选项props来声明需要从父级接收到的数据。
1、props的值有两种方式:
方式一:字符串数组,数组中的字符串就是传递时的名称。
<body><div id="app"><!-- message父组件data中的数据,msg传给子组件的属性,子组件需要使用msg来接收 --> <cpn :msg="message"></cpn></div><template id="tmp"> <div> <p>{{counter}}</p> <p>{{msg}}</p> </div></template></body><script>var vm = new Vue({ el: "#app", data: { message: "父组件的数据", }, components: { cpn: { template: "#tmp", props: ["msg"], data() { return { counter: 0, } }, }, },})</script>
在props中使用驼峰形式,模板中需要使用短横线的形式
字符串形式的模板中没有这个限制
<menu-item :menu-title="msg"></menu-item> Vue.component("menu-item", { props: ["menuTitle"], template: "<h3>{{menuTitle}}</h3>" });
字符串、数值、布尔值、数组、对象
通过props
本文地址:百科问答频道 https://www.neebe.cn/wenda/903499_2.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!