Vue组件基础

组件系统是Vue的重要概念,它允许我们使用小型,独立的可复用组件构造大型应用。在Vue中,一个组件的本质是一个拥有预定义选项的一个Vue实例。

例如:
最简单的Demo,Basic.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <div id="app">
        <base-userregister></base-userregister>
    </div>
    <script src="../../../Plugins/vue/dist/vue.js"></script>
    <script src="../../../Scripts/vue/Component/Basic.js"></script>
</body>
</html>

定义组件,生成Vue对象,Basic.js:

Vue.component("base-userregister",
    {
        data: function () {
            return {
                UserName: "111111",
                Password:"hello world"
            };
        },
        methods: {
            SubmitClick: function () {
                console.log("UserName:"+this.UserName);
            }
        },
        template: `<div>
                            <table>
                                <tr>
                                    <td><label>用户名:</label></td>
                                    <td><input type="text" v-model="UserName"/></td>
                                </tr>
                                <tr>
                                    <td><label>密码:</label></td>
                                    <td><input type="password" v-model="Password"/></td>
                                </tr>
                                <tr>
                                    <td colspan="2"><input type="submit" value="提交" v-on:click='SubmitClick'></td>
                                </tr>
                            </table>
                        </div>`
});
new Vue({
    el: "#app",
});

这样就把用户名和密码做成了一个组件。

注意:与普通的Vue对象相比,组件的data选项是一个Func,这是为了让多个相同类型的组件不会互相影响

父框架向组件传递数据,我们先在组件中注册props选项,然后在把数据通过属性传递到组件中。

例如:

Basic.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <div id="app">
        <base-bbspost title="中美贸易战" ></base-bbspost>
    </div>
    <script src="../../../Plugins/vue/dist/vue.js"></script>
    <script src="../../../Scripts/vue/Component/Basic.js"></script>
</body>
</html>

Basic.js

Vue.component("base-bbspost", {
    data: function () {
        return {};
    },
    props: {
        title: String,
        message: String
    },
    template: `<div>
                        <h2>{{title}}</h2>
                        <div>{{message}}</div>
                    </div>`
});
new Vue({
    el: "#app",
});

代码规范:props应该尽可能详细,至少需要指定其类型。它有两个好处:它们写明了组件的API所以很容易看懂组件的用法;在开发环境下,如果向组件提供格式不正确的prop,Vue会告警,以帮助你捕获潜在的错误来源。

反例:

// 这样做只有开发原型系统时可以接受
props: ['status']

好例子:

props: {
  status: String
}
// 更好的做法!
props: {
  status: {
    type: String,
    required: true,
    validator: function (value) {
      return [
        'syncing',
        'synced',
        'version-conflict',
        'error'
      ].indexOf(value) !== -1
    }
  }
}

组件也可以通过注册一个事件供上级调用,并传值。我们可以通过$emit方法传入事件名称和参数

Basic.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <div id="app">
        <div v-bind:style="{fontSize:fontSize + 'px'}">达达兔论坛</div>
        <base-changefont v-on:font-change="fontChange"></base-changefont>
    </div>
    <script src="../../../Plugins/vue/dist/vue.js"></script>
    <script src="../../../Scripts/vue/Component/Basic.js"></script>
</body>
</html>

Basic.js:

Vue.component("base-changefont", {
    data: function () {
        return {
            fontSize: [10, 12, 14, 16, 18, 20],
            font:10
        };
    },
    methods: {
        fontChange: function (event) {
            //调用父控件的方法
            this.$emit('font-change', this.font);
        }
    },
    template: `
        <div>
            <label>字体大小:</label>
            <select v-on:change="fontChange" v-model="font">
                <option v-for='item in fontSize'>{{item}}</option>
            </select>
            <label>px</label>
        </div>
    `
});

new Vue({
    el: "#app",
    data: {
        fontSize:10
    },
    methods: {
        fontChange: function (size) {
            this.fontSize = size;
        }
    }
});

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值