夜光带你走进Vue.js(二十五)擅长的领域

夜光序言:

 

曾经的明星,都是实打实的美貌,即使过了多年,翻开老片子,依然可以惊艳世人,如今才深刻了解到美貌真是稀缺资源,难以复刻。

 

 

 

 

 

正文:

Prop

prop 是父组件用来传递数据的一个自定义属性。

父组件的数据需要通过 props 把数据传给子组件,子组件需要显式地用 props 选项声明 "prop":

 

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>夜光</title>
</head>

<body>
<div id="app">
    <child message="Nice to meet you"></child>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
    // 注册
    Vue.component('child', {
        // 声明 props
        props: ['message'],
        // 同样也可以在 vm 实例中像 "this.message" 这样使用
        template: '<span>{{ message }}</span>'
    });
    // 创建根实例
    new Vue({
        el: '#app'
    })
</script>
</body>
</html>

 

动态 Prop

类似于用 v-bind 绑定 HTML 特性到一个表达式,也可以用 v-bind 动态绑定 props 的值到父组件的数据中。

每当父组件的数据变化时,该变化也会传导给子组件:

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>夜光</title>
</head>

<body>
<div id="app">
    <div>
        <input v-model="parentMsg">  <!--用v-model来双向数据绑定-->
        <br>
        <child v-bind:message="parentMsg"></child>
    </div>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
    // 注册
    Vue.component('child', {
        // 声明 props
        props: ['message'],
        // 夜光:同样也可以在 vm 实例中像 "this.message" 这样使用
        template: '<span>{{ message }}</span>'
    });
    // 夜光:创建根实例
    new Vue({
        el: '#app',
        data: {
            parentMsg: '父组件内容'
        }
    })
</script>
</body>
</html>

v-bind 指令将 todo 传到每一个重复的组件中:

 

 

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>夜光</title>
</head>

<body>
<div id="app">
    <ol>
        <todo-item v-for="item in sites" v-bind:todo="item"></todo-item>
    </ol>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
    Vue.component('todo-item', {
        props: ['todo'],
        template: '<li>{{ todo.text }}</li>'
    });
    new Vue({
        el: '#app',
        data: {
            sites: [
                { text: 'Genius' },
                { text: 'Google' },
                { text: 'Tianmao' }
            ]
        }
    })
</script>
</body>
</html>

 

这里,我们需要注意: prop 是单向绑定的:

当父组件的属性变化时,将传导给子组件,但是不会反过来。


 

有点帅~~自定义事件

父组件是使用 props 传递数据给子组件,但如果子组件要把数据传递回去,就需要使用自定义事件

我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface),即:

  • 使用 $on(eventName) 监听事件
  • 使用 $emit(eventName) 触发事件

另外,父组件可以在使用子组件的地方直接用 v-on 来监听子组件触发的事件。

下面这个例子:子组件已经和它外部完全解耦了。它所做的只是触发一个父组件关心的内部事件。

<!DOCTYPE html>
<html lang="en" xmlns:v-bind="http://www.w3.org/1999/xhtml" xmlns:v-on="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="UTF-8">
    <title>夜光</title>
</head>

<body>
<div id="app">
    <div id="counter-event-example">
        <p>{{ total }}</p>
        <button-counter v-on:increment="incrementTotal"></button-counter>
        <button-counter v-on:increment="incrementTotal"></button-counter>
    </div>
</div>
<script src="../js/vue.js"></script>
<script type="text/javascript">
    Vue.component('button-counter', {
        template: '<button v-on:click="incrementHandler">{{ counter }}</button>',
        data: function () {
            return {
                counter: 0
            }
        },
        methods: {
            incrementHandler: function () {
                this.counter += 1;
                this.$emit('increment')
            }
        },
    });
    new Vue({
        el: '#counter-event-example',
        data: {
            total: 0
        },
        methods: {
            incrementTotal: function () {
                this.total += 1
            }
        }
    })
</script>
</body>
</html>

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值