Vue入门笔记(二)——组件

Vue.js 组件

组件(Component)是 Vue.js 最强大的功能之一。

组件可以扩展 HTML 元素,封装可重用的代码。

组件系统让我们可以用独立可复用的小组件来构建大型应用,几乎任意类型的应用的界面都可以抽象为一个组件树
在这里插入图片描述

全局组件

全局组件,一次定义,就可以直接调用

<div id="root">
    <todo-item></todo-item>
</div>
 
<script>
// 注册
Vue.component('todo-item', {
  template: '<h1>自定义组件!</h1>'
})
// 创建根实例
new Vue({
  el: '#root'
})
</script>

局部组件

局部组件,需要在Vue实例中的compoents中注册它,不然就不能被使用报错: 组件未注册

<div id="root">
    <todo-item></todo-item>
</div>
 
<script>
var Child = {
  template: '<h1>自定义组件!</h1>'
}
 
// 创建根实例
new Vue({
  el: '#root',
  components: {
    // <todo-item> 将只在父模板可用
    'todo-item': Child
  }
})
</script>

prop

当我们定义好组件之后(自定义组件都是子组件),(Vue实例可以看成是一个父组件)需要往组件里面传递数据的时候,需要用到props这个属性,不然你的数据不会被组件接收到
下面content是我自己定义的一个属性(这里你可以随便写什么,什么就是属性

<div id="root">
    <div>
        <input v-model="inputValue"/>
        <button @click="handleSubmit">提交</button>
        <ul>
            <todo-item
                    v-for="(item , index) of list"
                    :key="index"
                    :content="item"
            >
            </todo-item>
        </ul>
    </div>
</div>
<script>
    //全局组件,一次定义,就可以直接调用
    Vue.component('todo-item', {
        props:['content'],
        template: '<li>{{content}}</li>'
    })

    new Vue({
        el: "#root",
        data: {
            inputValue: "hello",
            list: []
        },
        methods: {
            handleSubmit: function () {
                this.list.push(this.inputValue)
                this.inputValue = ''
            }
        }
    })
</script>

组件和实例

自定义组件都是Vue实例。上面自定义组件在名为Root根Vue实例中使用了另一个Vue实例(自定义组件),所以根Vue实例就是父组件,自定义组件就是子组件
Vue项目就是由很多个这样的Vue实例组成,所有它的父子关系也就有很多

自定义事件

子组件自定义事件的时候,数据无法直接从子组件传递到父组件,这里需要通过$emit来触发事件。在自定义组件中,写一个触发事件,调用$emit去触发delete事件,携带一个index参数。子组件中注册一个delete的事件,触发handleDelete事件,从而调用父组件的方法,并且将子组件的参数传递过去

<div id="root">
    <div>
        <input v-model="inputValue"/>
        <button @click="handleSubmit">提交</button>
        <ul>
            <todo-item
                    v-for="(item , index) of list"
                    :key="index"
                    :content="item"
                    :index="index"
                    @delete="handleDelete"
            >
            </todo-item>
        </ul>
    </div>
</div>
<script>
    //全局组件,一次定义,就可以直接调用
    Vue.component('todo-item', {
        props:['content',"index"],
        template: '<li @click="handleClick">{{content}}</li>',
        methods: {
            handleClick:function () {
                this.$emit('delete',this.index)
            }
        }
    })
        
    new Vue({
        el: "#root",
        data: {
            inputValue: "hello",
            list: []
        },
        methods: {
            handleSubmit: function () {
                this.list.push(this.inputValue)
                this.inputValue = ''
            },
            handleDelete:function (index) {
                alert(index)
                this.list.splice(index,1)
            }
        }
    })
</script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
组件Vue.js 最重要的概念之一。组件可以让我们将 UI 拆分为独立、可复用的部件,使得代码更加清晰、易于维护。在 Vue.js 组件可以分为全局组件局部组件,其全局组件可在任何地方使用,而局部组件只能在其组件使用。 定义组件时,需要使用 Vue.component() 方法,该方法需要传入两个参数:组件名称和组件配置对象。组件名称应该采用 kebab-case(短横线分隔命名)格式,以便在 HTML 使用。 示例代码如下: ```javascript // 定义一个名为 button-counter 的新组件 Vue.component('button-counter', { data: function () { return { count: 0 } }, template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>' }) ``` 在上述代码,我们定义了一个名为 button-counter 的组件,该组件包含一个计数器,每次点击按钮计数器加一。 在 HTML 使用组件时,需要使用组件名称作为自定义标签来调用组件。示例代码如下: ```html <div id="app"> <button-counter></button-counter> </div> ``` 在上述代码,我们调用了 button-counter 组件,并将其渲染到了 id 为 app 的 div 元素。 除了组件的 data 和 template 属性外,还可以使用 props 属性来传递组件之间的数据。使用 props 时,需要组件的配置对象定义 props 属性,并在 HTML 使用 v-bind 指令来传递数据。 示例代码如下: ```javascript // 定义一个名为 todo-item 的新组件 Vue.component('todo-item', { props: ['todo'], template: '<li>{{ todo.text }}</li>' }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app', data: { groceryList: [ { id: 0, text: '蔬菜' }, { id: 1, text: '水果' }, { id: 2, text: '奶酪' } ] } }) ``` 在上述代码,我们定义了一个名为 todo-item 的组件,并使用 props 属性定义了一个名为 todo 的 prop。在 HTML ,我们使用 v-bind 指令将 groceryList 数组的每个对象传递给了 todo-item 组件。示例代码如下: ```html <div id="app"> <ul> <todo-item v-for="item in groceryList" v-bind:todo="item" v-bind:key="item.id"></todo-item> </ul> </div> ``` 在上述代码,我们使用 v-for 指令遍历 groceryList 数组,并使用 v-bind 指令将数组的每个对象传递给了 todo-item 组件。注意,我们还需要使用 v-bind:key 指令来为每个列表项指定一个唯一的 key 值。 插槽是 Vue.js 一个重要的概念。插槽可以让组件组件插入任意的 HTML 内容,使得组件更加灵活、可复用。 在组件使用 <slot> 标签来定义插槽。在组件使用组件的自定义标签来调用组件,并在标签内部插入 HTML 内容。示例代码如下: ```javascript // 定义一个名为 alert-box 的新组件 Vue.component('alert-box', { template: ` <div class="alert-box"> <strong>Error!</strong> <slot></slot> </div> ` }) // 创建一个 Vue 实例 var app = new Vue({ el: '#app' }) ``` 在上述代码,我们定义了一个名为 alert-box 的组件,并在组件定义了一个插槽。在 HTML ,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。示例代码如下: ```html <div id="app"> <alert-box> <p>Something bad happened.</p> </alert-box> </div> ``` 在上述代码,我们调用了 alert-box 组件,并在标签内部插入了一些 HTML 内容。该 HTML 内容会被插入到 alert-box 组件的插槽
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值