组件

作者: 执念_6afc | 来源:发表于2018-09-23 19:28 被阅读0次

组件(component): 是vue最强大的功能之一 组件化开发
组件可以扩展 HTML 元素,封装可重用的代码。
全局
局部

组件之间的传值******
父传子 用属性传
子传父 用事件传
同级之间传值

全局组件

例:

<div id='app'> 
<my-component></my-component> 
</div>
 <script src='js/vue.js'></script>
 <script> 
//全局: Vue.component('my-component',{ 
template:` 
<div> <h1>这是一个组件</h1>
 <ul> 
<li>1111</li> 
<li>1111</li>
 <li>1111</li>
 <li>1111</li> 
</ul> </div> ` }) 
new Vue({ el:'#app', }) 
</script>

局部组建

例:

<div id='app'>
 <asd></asd>
 </div> 
<script src='js/vue.js'></script>
 <script>
 new Vue({
 el:'#app', 
data:{}, 
components:{ 
'asd':{ 
template:` 
<div>
 <h1>这是一个组件</h1> 
<ul> 
<li>1111</li>
 <li>1111</li> 
<li>1111</li> 
<li>1111</li> 
</ul> 
</div> ` 
}
 }
 }) 
</script>

实例

点击弹出窗口

<div id='app'> 
<my-component></my-component>
 </div>
 <script src='js/vue.js'></script>
 <script>
 Vue.component("my-component",{
 template:` 
<div>
 <h1>{{msg}}</h1> 
<button @click='alt'>按钮</button> 
</div> `,
 data:function(){ 
return{ 
msg:'dcgf'
 }
 },
 methods:{ alt:function(){
 alert(11111)
 } 
}
 }) 
new Vue({ el:'#app', }) 
</script>

父传子

<div id='app'> 
<my-content></my-content> 
</div>
 <script src='js/vue.js'></script> 
<script>
 Vue.component("my-content",{
 template:` 
<div>
 <h2>我是my-content组件的标题</h2> 
<my-child v-bind:message='msg'></my-child>
 </div> `, 
data:function(){
 return{ 
msg:'dgddbghfghfnh' 
} 
} 
})
 Vue.component("my-child",{
 props:['message'], 
template:` 
<div>
 <h3>我是my-child组件中的标题</h3>
 <p>{{message}}</p> 
</div> ` })
 new Vue({ 
el:'#app'
 }) 
</script>

水果列表

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   <div id='app'>
       <my-father></my-father>
   </div>
    <script src='js/vue.js'></script>
    <script>
        Vue.component('my-father',{
            template:`
               <div>
                   <input type="text" v-model="inputVal"> <button @click='add'>添加</button>
                   <my-child v-bind:fruit='list'></my-child>
               </div>
             `,
            data:function(){
                return{
                    list:['apple','pear','orange'],
                    inputVal:''
                }
            },
            methods:{
                add:function(){
                   this.list.push(this.inputVal); 
                }
            }
        })
    
        Vue.component('my-child',{
            props:['fruit'],
            template:`
              <ul>
                 <li v-for="(value,index) in fruit">
                    {{value}}
                     <button @click="delt(index)">删除</button>
                  </li>
              </ul>
           `,
            methods:{
                delt:function(ind){
                    this.fruit.splice(ind,1)
                }
            }
        })
    
    
    
        new Vue({
            el:'#app'
          })
    </script>
</body>
</html>

子传父

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
   <div id='app'>
       <my-father></my-father>
   </div>
    <script src='js/vue.js'></script>
    <script>
        Vue.component('my-father',{
            template:`
               <div>
                   <input type="text" v-model="inputVal"> <button @click='add'>添加</button>
                   <my-child v-bind:fruit='list'></my-child>
               </div>
             `,
            data:function(){
                return{
                    list:['apple','pear','orange'],
                    inputVal:''
                }
            },
            methods:{
                add:function(){
                   this.list.push(this.inputVal); 
                }
            }
        })
    
        Vue.component('my-child',{
            props:['fruit'],
            template:`
              <ul>
                 <li v-for="(value,index) in fruit">
                    {{value}}
                     <button @click="delt(index)">删除</button>
                  </li>
              </ul>
           `,
            methods:{
                delt:function(ind){
                    this.fruit.splice(ind,1)
                }
            }
        })
    
    
    
        new Vue({
            el:'#app'
        })
    </script>
</body>
</html>

购物车

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <link rel="stylesheet" href="css/bootstrap.css">
</head>
<body>
   <div id='app'>
       <my-father></my-father>
   </div>
    <script src='js/vue.js'></script>
    <script>
        Vue.component('my-father',{
            template:`
              <div class='container'>
               <table class='table table-bordered text-center'>
                  <thead>
                      <tr>
                         <th class='text-center'>编号</th>
                         <th class='text-center'>名称</th>
                         <th class='text-center'>单价</th>
                         <th class='text-center'>数量</th>
                         <th class='text-center'>小计</th>
                       </tr>
                  </thead>
                 <my-child v-bind:product='goods'></my-child>
               </table>
             </div>
          `,
            data:function(){
                return{
                    goods:[
                        {pname:'apple',price:3,count:3,sub:9},
                        {pname:'pear',price:4,count:4,sub:16},
                        {pname:'orange',price:5,count:5,sub:25}
                    ]
                }
            }
        })
   
        Vue.component('my-child',{
            props:['product'],
            template:`
                <tbody>
                  <tr v-for="(value,index) in product">
                     <td>{{index+1}}</td>
                     <td>{{value.pname}}</td>
                     <td>{{value.price}}</td>
                     <td>
                          <button @click='add(index)'>+</button>
                          <span>{{value.count}}</span>
                         <button @click='redu(index)'>-</button> 
                      </td>
                     <td>{{value.sub}}</td>
                  </tr>
                  <tr>
                      <td colspan=5>总价:{{sum}}</td>
                  </tr>
                </tbody>
            `,
            data:function(){
                return{
                    sum:0
                 }  
            },
            methods:{
                add:function(ind){
                    this.product[ind].count++;
                    //小计、
                    this.product[ind].sub=this.product[ind].count*this.product[ind].price;
                    this.countSum();
                 
                },
                redu:function(ind){
                    if(this.product[ind].count>1){
                       this.product[ind].count--;
                    }  
                    //小计
                      this.product[ind].sub=this.product[ind].count*this.product[ind].price;
                     this.countSum();
                },
                countSum:function(){
                    for(var i=0,total=0;i<this.product.length;i++){
                        total+=this.product[i].sub;
                    }
                    this.sum=total;
              }
            
            
            }
        })
    
    
        new Vue({
            el:'#app'
        })
    </script>
</body>
</html>

相关文章

网友评论

      本文标题:组件

      本文链接:https://www.haomeiwen.com/subject/mzbtoftx.html