Web前端之路让前端飞

vue UI组件开发

2017-07-01  本文已影响210人  rayman_v

1. 新建组件:

<script src="/public/javascripts/vue.js"></script>
<style>
    #app1{background-color: red}
    #app2{background-color: blue}
</style>
<body>
<div id="app1">
    <box-one></box-one>
    <box-two></box-two>
    <boxThree></boxThree>
</div>
<div id="app2">
    <box-one></box-one>
    <box-two></box-two>
</div>
<box-one></box-one>
<box-two></box-two>
<script>
Vue.component('box-one', {
    template: '<div class="box-one">box-one</div>'
});
var app1 = new Vue({
    el: '#app1',
    components: {
        'box-two': {
            template: '<div class="box-two">box-two</div>'
        },
        'boxThree': {
            template: '<div class="boxThree">boxThree</div>'
        }
    }
});
var app2 = new Vue({
    el: '#app2'
});
</script>

2. 浏览器渲染网页标签的限制:

<script src="/public/javascripts/vue.js"></script>
<style>
    .red{background-color: red}
    .blue{background-color: blue}
</style>
<body>
<div id="app1">
    <table class="red">
        <box-one></box-one>
    </table>
    <select class="red">
        <box-two></box-two>
    </select>
    
    <table class="blue">
        <tr is="box-one"></tr>
    </table>
    <select class="blue">
        <option is="box-two"></option>
    </select>
</div>
<script>
Vue.component('box-one', {
    template: '<tr><td>box-one</td></tr>'
});
Vue.component('box-two', {
    template: '<option>option</option>'
});
var app1 = new Vue({
    el: '#app1'
});
</script>

3. 组件中的 data 数据集:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <done-button></done-button>
</div>
<script>
Vue.component('done-button', {
    template: '<button>{{text}}</button>',
    data: function (){
        return {
            text: 'ok'
        }
    }
});
var app1 = new Vue({
    el: '#app1'
});
</script>

4. 实例给组件传值:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <done-button text="submit" textOne="submit1" text-two="submit2"></done-button>
</div>
<script>
Vue.component('done-button', {
    template: '<button :data-text="text" :data-text-one="textOne" :data-text-two="textTwo">{{text}}</button>',
    props: ['text', 'textOne', 'textTwo']
});
var app1 = new Vue({
    el: '#app1'
});
</script>

5. 组件标签属性使用动态数据:

<script src="/public/javascripts/vue.js"></script>
<style>
    .appNumber{background-color: red}
</style>
<body>
<div id="app1">
    <done-button :number="appNumber"></done-button>
    <button class="appNumber" @click="appNumber++">{{appNumber}}</button>
</div>
<script>
Vue.component('done-button', {
    template: '<button @click="number++">{{number}}</button>',
    props: ['number']
});
new Vue({
    el: '#app1',
    data: {
        appNumber: 0
    }
});
</script>

6. 自定义组件属性的值的规则:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <done-button number1="a" number2="1" :number3="1" ></done-button>
</div>
<script>
Vue.component('done-button', {
    template: '<button :num1="number1" :num2="number2" :num3="number3">{{number1}}</button>',
    props: {
        number1: {
            type: Number
        },
        number2: {
            type: Number
        },
        number3: {
            type: Number
        }
    }
});
new Vue({
    el: '#app1'
});
</script>
{
   // 属性类型: String、Number、Boolean、Function、Object、Array,null-任意类型,
   // 可以使用数组多选
   type: null,
   
   // 是否必须被赋值:true、false
   required: false,
   
   // 默认值:可以是一般任意值或有返回值的函数
   default: '',
   
   // 自定义判断函数:参数 value 为调用时传入的值,
   // 返回 true、false 来通知 vue 机制是否报错
   validator: function(value){ return true } 
}

7. 组件内给实例发送通知:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <done-button v-on:child="father" ></done-button>
</div>
<script>
Vue.component('done-button', {
    template: '<button v-on:click="add()">增加</button>',
    methods: {
        add: function () {
            this.$emit('child', 11);
        }
    }
});
new Vue({
    el: '#app1',
    methods: {
        father: function(number) {
            console.log('father' + number);
        }
    }
});
</script>
vue-component-2.gif

8. 组件之间通信:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <done-button ></done-button>
    <cancel-button></cancel-button>
</div>
<script>
var bus = new Vue();
Vue.component('done-button', {
    template: '<button v-on:click="send()">发送</button>',
    methods: {
        send: function () {
            bus.$emit('done-emit', 11);
        }
    }
});
Vue.component('cancel-button', {
    template: '<p>{{text}}</p>',
    data: function (){
        return {
            text: '00'
        }
    },
    mounted: function() {
        var _this = this;
        bus.$on('done-emit', function(number) {
            _this.text = number;
        });
    }
});
new Vue({
    el: '#app1',
    methods: {
        call: function(value) {
            console.log('father:' + value);
        }
    }
});
</script>
vue-component-3.gif

9. 组件内容节点的分发:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <box></box>
    <box>
        <h4>box1</h4>
    </box>
    <box>{{box2Text}}</box>
</div>
<script>
Vue.component('box', {
    template: '<p><slot>默认</slot></p>'
});
new Vue({
    el: '#app1',
    data: {
        box2Text: 'box2'
    }
});
</script>

10. 多个 <slot> 标签之间的使用:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <box>
        <p>ppppp</p>
        
        <p slot="h4">h4</p>
        <h4 slot="h4">h4</h4>
        
        <p slot="h5">h5</p>
        <h5 slot="h5">h5</h5>
    </box>
</div>
</div>
<script>
Vue.component('box', {
    template: [
        '<div id="box">',
            '<div class="default">',
                '<slot></slot>',
            '</div>',
            '<div class="h4">',
                '<slot name="h4"></slot>',
            '</div>',
            '<div class="h5">',
                '<slot name="h5"></slot>',,
            '</div>',
        '</div>',
    ].join('')
});
new Vue({
    el: '#app1'
});
</script>

11. <slot> 标签回传数据给内容节点:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <box >
        <template scope="props">
            <span>{{props.text}}</span>
        </template>
    </box>
</div>
</div>
<script>
Vue.component('box', {
    template: '<div id="box"><slot v-for="i in items" :text="i"></slot></div>',
    data: function (){
        return {
            items: [0,1,2,3,4]
        }
    }
});
new Vue({
    el: '#app1'
});
</script>

12. 动态切换组件:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <component :is="view"></component>
    <button @click="view = 'inlinebox'">change</button>
</div>
</div>
<script>
Vue.component('box', {
    template: '<div id="box">box</div>',
});
Vue.component('inlinebox', {
    template: '<div id="inlinebox">inlinebox</div>'
});
new Vue({
    el: '#app1',
    data: {
        view: 'box'
    }
});
</script>
vue-component-4.gif

13. 在实例中访问子元素对象:

<script src="/public/javascripts/vue.js"></script>
<body>
<div id="app1">
    <box ref="box1"></box>
</div>
</div>
<script>
Vue.component('box', {
    template: '<div id="box">box</div>',
});
new Vue({
    el: '#app1',
    mounted: function() {
        console.log(this.$refs);
    }
});
</script>
上一篇 下一篇

猜你喜欢

热点阅读