最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • ⑩ Vue父组件向子组件传值

    正文概述 掘金(CRMEB技术团队)   2021-01-10   534

    ⑩ Vue父组件向子组件传值

    简单来说就是:每个页面都会抽象成如上图所示的组件树,组件之间如何通信,就是我们今天要展开说的组件之间的传值。

    举个例子: 组件之间传值,那么这个实例就必须以组件化的方式去创建,上一章组件的使用,这个项目必须通过http serve启动,本地是不生效的!

    // 项目结构
    
    ├── index.html
    ├── main-view.js
    └── main.js
    
    • 创建了一个main-view的组件,并未这个组件在一个 methods中配置了一个onChangeDescClick的点击事件,这个事件函数有个参数type通过点击动态改变。(如下)
    // main-view.js
    
    var MainView = {
      // 注意这里这个#main-view,引入的内容通过设置js的type="text/x-template"将内容append进Dom!
      template: '#main-view',
      data: function () {
        return {
          desc: '这是Android的描述信息'
        }
      },
      methods: {
        onChangeDescClick: function (type) {
          this.desc = '这是' + type + '的描述信息';
        }
      }
    };
    
    // 导出
    export { MainView };
    

    在main.js中我们在new Vue之前导入组件,并通过局部注册组件的方式注册组件!(如下)

    // main.js
    
    import { MainView } from './main-view.js';
    var vm = new Vue({
        el: '#app',
        components: {
          'main-view': MainView,
        }
    });
    
    <!-- index.html -->
    
    <div id="app">
        <main-view></main-view>
    </div>
    <!--<main-view></main-view>组件实际渲染的内容 -->
    <script type="text/x-template" id="main-view">
        <div>
            <button @click="onChangeDescClick('Android')">Android</button>
            <button @click="onChangeDescClick('IOS')">IOS</button>
            <button @click="onChangeDescClick('Vue')">Vue</button>
    
            <p>
                {{desc}}
            </p>
        </div>
    </script>
    
    <script src="./main.js" type="module"></script>
    

    在上面的代码中,声明了一个mainView 的组件,在组件中提供了三个按钮,通过这三个按钮来改变下面的描述信息 desc,顺便回顾了以下上一节的组件使用的内容。

    然后,我们又想将<p>{{desc}}</p>抽象成一个组件,通过组件的形式引入到main-view组建中,使main-view组件与desc-view嵌套,组成父子关系组件!

    ⑩ Vue父组件向子组件传值

    // index.html
    
    <script type="text/javascript">
      Vue.component('desc-view', {
        template: '<p>{{pushSubDesc}}</p>',
          props: {
            pushSubDesc: ''
          }
      });
    </script>
    <script src="main.js" type="module"></script>
    

    然后通过v-bind:pushSubDesc='desc'来修改pubshSubDesc的值看看,发现这样依然是可以的,这就是父组件向子组件传值的方法!

    但其实可以不用这么复杂的去实现这个,Vue给我在创建组件的时候提供了一对template标签可直接使用,上边只是为了回顾一下昨天的知识以及对今天的知识做一个引入理解,模拟一下真实的项目开发中如何使用!

    下来我们看一下如何在单文件中组件之间传值!

    <!-- 创建父组件模板 -->
    <template id="main-view">
    	<div>
    		组件:{{ fristname}}
    	</div>
    </template>
    		
    <!-- 使用组件 -->
    <div id="app">
    	<!-- 父组件传值给子组件 -->
    	<desc-view :fristname="name"></desc-view>
    </div>
    		
    <!-- 定义和注册组件 -->
    		
    <script type="text/javascript">
    	Vue.component('desc-view',{
    		template:"#main-view",
    		// 接收数据
    		props:{
    			// 这里的数据类型要与父组件的类型对应
    			fristname:String
    		},
    		
    	});
    			
    var app = new Vue({
    	el:"#app",
    	data:{
    		name:"vue好难学"
    	}
    })
    </script>
    

    Prop 还支持多种类型,下面我们来看一下 Prop 支持的数据类型:

    String
    Number
    Boolean
    Array
    Object
    Date
    Function
    Symbol   
    

    看下面的示例: 1、父组件传值给子组件props:[]【数组传值】

    <div id="app">
    	<cpn :s></cpn>
    </div>
    		
    <template id="cpn">
    	<div>
        	<h1>{{ stitle }}</h1>
        	<h2>{{ message }}</h2>
    	</div>
    </template>
    		
    <script type="text/javascript">
    			
    	// 子组件
    	Vue.component('cpn',{
    		template:"#cpn",
    		data:function(){
    			return{
    				message:"这是一个组件"
    			}
    		},
    		props:['stitle']
    	})
    			
    	// 父组件
    	const app = new Vue({
    		el:"#app",
    		data:{
    			title:"这是一个标题"
    		}
    	})
    			
    </script>
    

    2、父组件传值给子组件,对象中的对象写法

    <div id="app">
    	<cpn :s :sname="names"></cpn>
    </div>
    		
    <template id="cpn">
    	<div>
    		<h1>{{ stitle }}</h1>
    		<h2>{{ message }}</h2>
    		<h3>{{ sname }}</h3>
    	</div>
    </template>
    		
    <script type="text/javascript">
    			
    	// 子组件
    	Vue.component('cpn',{
    		template:"#cpn",
    		data:function(){
    			return{
    				message:"这是一个组件"
    			}
    		},
    		props:{
    		// 对象的对象写法,默认值当组件中没有通过v-bind绑定时默认显示
    			stitle:{
        			type:String,
        			default:"aaaa"
    			},
    			
    	// 如果这里为数组或者对象,默认值必须使用函数
    			sname:{
    				type:Array,
    				default:function(){
    					return ['liudehua', 'yuxi']
    				}
    			}
    		}
    	})
    			
    	// 父组件
    	const app = new Vue({
    		el:"#app",
    		data:{
    			title:"这是一个标题",
    			names:['zhangzhen', 'xingfu'],
    			required:true  // 这个属性限制必须传值,不然报错
    		}
    	})
    			
    </script>
    

    小知识点:组件中的data为什么必须是一个函数?

    下一节:Vue子组件向父组件传值!


    起源地下载网 » ⑩ Vue父组件向子组件传值

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元