Vue.js学习(三)

Vue,js 高博文
文章标签: vue.js

Vue.js学习(三)

组件的学习

①基础概念

1.1组件是一个可复用的Vue实例,需要挂载到Vue的实例上。

1.2组件除了el选项外,同样包括有data、computed、watch、methods以及生命周期等。

②定义组件

2.1组件的data和Vue实例有区别。组件通过一个函数返回一个对象,而Vue实例是对象,组件用函数返回一个对象主要是组件可以复用,在复用的时候不影响其他的组件。

2.2组件没有el选项,vue实例有el选项。

2.3组建的html元素定义在template属性上。Vue实例通过el指定挂载的位置。

<body>
    <div id="app">
        <button-counter></button-counter>
        <button-counter></button-counter>
        <button-counter></button-counter>
    </div>
</body>
<script>
    //定义组件
    var component1 = {
        data() {
            return {
                count: 0,
            }
        },
        template: `
          <button @click='count++'>点击{{count}}</button>
          `
    }
    //全局注册组件
    Vue.component("button-counter", component1);
    var vm = new Vue({
        el: "#app",

    })
</script>

③注册组件到Vue实例

3.1全局注册代码如上:

3.2组件名要求:组件名1.要短横线隔开,使用时一样。2.用帕斯卡命名(大驼峰)用component注册是命名使用大驼峰,在使用组件的时候就要把大写变成小写并在前面加短横线。

组件名称最高全部采用小写,因为html标签始终都是小写的,只有html的名称与组件一致才匹配。另外一种方式组件采用大驼峰命名,表签名每个单词用短横杠分隔。推荐组名用小写,因为html的标签名始终是小写方式渲染的,这样就可以避免不必要的麻烦。

3.3局部注册:定义在components上,属性名就是自定义元素的名字,属性值就是这个组建的额选项对象。局部注册的组件在其子组件中不可用。

<body>
    <div id="app">
        <button-count></button-count>
        <button-count></button-count>
        <button-count></button-count>
    </div>
</body>
<script>
        var component1={
            data(){//data用函数 返回一个对象,目的是复用
               return {
                   count:0,
               }
            },
            template:`
            <button @click='count++'>点击{{count}}</button>
            `
        }
        var vm=new Vue({
            el:"#app",
            components:{
                "button-count":component1,
            }
        })
</script>

④props-父组件给子组件传递数据

<body>
    <h1>数组</h1>
    <div id="app">
      <cousrse-itme :arr='arr'></cousrse-itme>
      <cousrse-itme :arr='arr'></cousrse-itme>
    </div>
    <h1>对象</h1>
    <div id="app1">
        <props-obj :age=18 :height=20></props-obj>
    </div>
</body>
<script>
    //数组
    var courseLIst={
        props:['arr'],
        template:`<div>
         <p v-for='(itme,index) in arr'>{{itme}}{{index}}</p>
         </div>
        `
    }
    var vm=new Vue({
        el:"#app",
        data:{
            arr:["a",2,3,4,5,6]
        },
        components:{
            "cousrse-itme":courseLIst
        }
    })

    //对象
    var courseLIst1={
        props:{
            height:Number,
            age:{
                type:Number,//数据类型
                default:18,//默认值
                required:true,//是否必须
                validator(val){//校验器
                    return val>0&&val<60
                }
            }
        },
        template:`
        <p>高为:{{height}}  年龄为:{{age}}</p>
        `
    }

    var vm1=new Vue({
        el:"#app1",
        data:{
            obj:{
                height:180,
                age:20,
            }
        },
        components:{
            "props-obj":courseLIst1,
        }
    })

props可以用数组和对象的方式传值。注意命名:1.全小写:节点上的名称与属性的名一致。2.小驼峰:节点上要使用短横杠隔开,大小写没有关系。

⑤通过自定义事件向父级组件发送信息

5.1在vue.js中,可以使用$emit自定义事件

语法:$emit("事件名",“事件传递的数据”)。

v-model实际上是@input="value=$event"操作的语法糖。

<body>
    <div id="app">
       <!-- <stu-content @left-length="leftnumber=$event"></stu-content> -->
       <stu-content v-model="leftnumber"></stu-content>
       <p>剩余字数{{leftnumber}}</p>
    </div>
</body>
<script>
    var component1={
        data(){
            return{
                content:'',
                maxLength:50,
            }
        },
        watch:{
           content(n,o){
            // this.$emit("left-length",this.maxLength-n.length);
            this.$emit("input",this.maxLength-n.length);
           }
        },
        template:`<div>
        <textarea v-model='content' maxLength='50'></textarea>
        </div>
        `,
    }
    var vm=new Vue({
        el:"#app",
        data:{
            leftnumber:50,
        },
        components:{
            "stu-content":component1,
        }
    })
</script>

⑥通过插槽分发内容

把组件之间的内容传入到组件中,使用<slot></slot>插槽,实例代码如下:

<body>
<div id="app">
<stu-content v-model="leftnumber">50
<div slot="frist">第一个</div>
<div slot="frist1">第二个</div>
</stu-content>
<p>剩余字数{{leftnumber}}</p>
</div>
</body>
<script>
var component1={
data(){
return{
content:"",
maxlength:50
}
},
template:`
<div>
<textarea v-model="content" maxLength='50'></textarea>
<p>限输<slot></slot>字</p>
<slot name='frist'></slot>
<slot name='frist1'></slot>
</div>
`,
watch:{
content(n,o){
this.$emit("input",this.maxlength-n.length)
}
}
}
var vm=new Vue({
el:"#app",
data:{
leftnumber:50,
},
components:{
"stu-content":component1,
}
})
</script

还能输出{{restrictNumber}}个字符  
  • {{reply.author}}

    {{CommonUtil.formateDate(reply.ac_CommentDate).shortTime}}
  • 回复了{{Comments.author}} :