美文网首页超级简单的vue入门教程
Vue.js入门教程(九)组件

Vue.js入门教程(九)组件

作者: 党云龙 | 来源:发表于2019-10-05 22:31 被阅读0次

    第九章:组件

    有话说在前面


    组件和双向数据绑定,是vue中最重要的部分。这里你务必要仔细研究,因为很多时候,组件之间的传值,父子兄弟关系将会成为未来困扰你,甚至很多高手的关键所在。

    全局声明组件


    <div id="app">
        <zj1></zj1>
    </div>
    <script type="text/javascript">
        //创建全局组件
        Vue.component("zj1",{
             template:"<h1>hello world!</h1>"
        })
        //创建根实例 你可以理解为创建一个模型 在vue里面没有控制器一说
        new Vue({
             el:"#app",
        })
    </script>
    

    局部声明组件


    <table id="app2">
        <tr is="zjs"></tr>
    </table>
    <script type="text/javascript">
        var zj2={
             template:"<tr><td>我是内部元素</td></tr>"
        }
        new Vue({
             el:"#app2",
             components:{
                 "zjs":zj2,
             }
        })
    </script>
    

    组件相互绑定


    <bottomlogo v-bind:src="link"></bottomlogo>
    

    通过v-bind 把你需要用的属性,绑定到主要的组件上

    Vue.component('bottomlogo', {
         props:['src'], //声明一个 用于接收父级或者同胞传输过来值 的名字
         template: '<div class="ft_log"><img :src="src"></div>',
    })
    
    new Vue({
         el:"#public-footer",
         data:{
              "link":"src/images/common/foot_logo.png",
         }
    })
    

    组件之间通信/传值


    注意当你处理复杂的组件关系的时候,建议你使用vuex,如果只是简单的父子关系可以使用这个方法。
    props 在接收数据的时候 是可以做验证的。
    验证例子:

    Vue.component('example', {
      props: {
        // 基础类型检测 (`null` 意思是任何类型都可以)
        propA: Number,
        // 多种类型
        propB: [String, Number],
        // 必传且是字符串
        propC: {
          type: String,
          required: true
        },
        // 数字,有默认值
        propD: {
          type: Number,
          default: 100
        },
        // 数组/对象的默认值应当由一个工厂函数返回
        propE: {
          type: Object,
          default: function () {
            return { message: 'hello' }
          }
        },
        // 自定义验证函数
        propF: {
          validator: function (value) {
            return value > 10
          }
        }
      }
    })
    

    父传子


    //父级元素 现在我要把父级里面的data中的name传给子级
    const title = new Vue({
        el: '#title',
        store,
        components: {layertitle},
        data(){
            return {
                name:"成人学历"
            }
        },
        template: `,
        <header id="title">
            <layertitle :name="name"></layertitle>
            //子级这里接收写法    ":" + 你要发送的属性 引号里面是要发送的值
        </header>
        `
    })
    
    export default {
       //名称
       name: "title",
       //他的所属组件
       components: {},
       data(){
         return {
             name:"本组件的自身值"
         }
       },
       methods:{
          myid: function (index){
             return "myid_" +index
          },
          alert:function(index){
             mantis.requestChat();
          }
       },
       props: ["name"],  //先声明你要接收的属性 然后你要注意,你data中得有这个属性才行
    };
    

    子传父


    子级传值父级,是用过$emit操作的,
    不过子级不能直接改变父级的值,但是他可以调用父级里面的方法。
    通过父级分享给子级的方法,来操作父级。

    //父组件 ——————————————》  
    const title = new Vue({
        template: `
        <header id="title" :data-name="num">
            <layertitle :name="name" @jia="jianum"></layertitle>
        </header>
        `,
        methods:{
            jianum:function(){
                this.num++;
            }
        }
    })
    
    //子组件——————————————————————————————》  子组装件只要绑定一个事件,然后把指定this.$emit去调用父级的方法
    <template>
        <ul class="but_ul" :data-name="name">
            <li v-for="(item,index) in count" :id="myid(index)" @click="jss">
                <a href="javascript:;">{{item}}</a>
            </li>
        </ul>
    </template>
    
    methods:{
       jss:function(){
           this.$emit('jia'); //这里的jia 对应 父级组件中的@jia
           this.$emit('jia',this.data); // 第一个是方法名,后面的是要传递的变量,父级只需要通过function(val) val就是发送过来的值
       }
    }
    

    小贴士:


    当你的app.js和layer.vue不在一个目录的时候


    注意目录路径

    是这样的时候,你就需要在调用的目录中修改一下路径了。

    //引入组件 titlelayer
    import titlelayer from '../com/titlelayer.vue'
    

    相关文章

      网友评论

        本文标题:Vue.js入门教程(九)组件

        本文链接:https://www.haomeiwen.com/subject/yphnuctx.html