0810 vue 创建组件 模板 动态组件 传值

Posted wangwenxin123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0810 vue 创建组件 模板 动态组件 传值相关的知识,希望对你有一定的参考价值。

  lesson10
 
1.demo    vue样本
<body>
<div id="myApp">
 
</div>
</body>
<script>
   new Vue(
       el:"#myApp",
       data:,
       methods:,
       computed:,
       filters:
   )
</script>
 
2.案例: 模拟百度搜索框
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        *
            padding:0;
            margin:0;
        
        p
            border:1px solid green;
        
        p.active
            background:gray;
        
    </style>
    <script src="lib/vue.js"></script>
    <!--1、依赖于你的vue.js
        2、当你引入resource时,它会在你的Vue.prototype.$http=-->
    <script src="lib/vue-resource.js"></script>
</head>
<body>
<div id="myApp">
    <!--<input type="text" @keyup.65="search">-->
    <!--<input type="text" @keyup.a="search">-->
    <!--<input type="text" @keyup.left="search">-->
    <form action="https://www.baidu.com/s" target="_blank">
        <input type="text" autocomplete="off" v-model="pwd"  name="wd" @keyup="search">
    </form>
    <p v-for="(item,i) in g"   :class="active:index===i">item.q</p>
</div>
</body>
<script>
    // Vue.prototype.$zhang =
    //     run()
    //         console.log(12);
    //     
    //
    new Vue(
        el:"#myApp",
        data:
            pwd:"",
            g:[],
            index:-1,
            q:""// q 代表的是搜索的值
        ,
        methods:
            search(e)
                // 第一个参数是地址,第二个参数是你传递的内容,第三个是cb
                //  https://www.baidu.com/sugrec?prod=pc&from=pc_web&wd=%E6%97%A0%E9%87%8F&cb=fn
                if(e.keyCode === 40)
                    this.index++;
                    if(this.index> this.g.length-1)
                        this.index=-1;
                        this.pwd = this.q;// 搜索的数据
                    else
                        this.pwd = this.g[this.index].q;
                    
                else
                     this.$http.jsonp("https://www.baidu.com/sugrec",
                        from:"pc_web",
                        prod:"pc",
                        wd:this.pwd
                    ,
                        jsonp:"cb"
                    ).then((data)=>
                        console.log(data);
                        this.g = data.g;
                        this.q = data.q;
                    )
                
                //  https://www.baidu.com/sugrec?from=pc_web&pwd=&cb=
                // console.log(e.keyCode)
                // this.$zhang.run();
            
        ,
        computed:,
        filters:
    )
</script>
</html>
 
 
3.模板     template
   
   1、template 有且只能有一个根元素。
   2、将你要挂载的元素进行替换操作。
   3、模板当中可以使用指令,data,methods等等都可以使用
   // 注意:
          当你实现化VUE实例时,他会看是否有模板,如果有会将你挂载的元素替换。如果没有就使用你挂载的元素作为模板。
 
 
template有三种使用方法
   1、直接赋值
       template:`<div>1</div>`
   2、通过script标签来定义
       <script type="x/template" id="tp">
           <div>2</div>
       </script>
       template:"#tp"
   3、使用内置组件template
       <template id="my">
           <div>3</div>
       </template>
       template:"#my"
 
 
4.补充指令
    v-html:输出的是HTML,可以被浏览器所识别编译。
    v-text:输出的是纯文本格式
 
5.组件
实例:  组件1
<body>
<div id="myApp">
   大家好,我在MyApp中
   <one></one>   组件的调用
</div>
</body>
<script>
   new Vue(
       el:"#myApp",
       // 定义组件  注册组件   ----》局部组件
       components:
           one:
              // 模板决定你组件的内容。
               template:`<div>one组件当中</div>`
           
       
   )
</script>
 
实例: 组件2
<body>
<div id="myApp">
   大家好,我在MyApp中
   <one></one>
</div>                   //挂载的元素
</body>
<script>
   new Vue(
       el:"#myApp",
      template:`<div>啦啦啦<one></one></div>`,        //template模板 会将挂载的元素替换
       components:
           one:
               template:`<div>one组件当中</div>`                  //one  就是 vue实例下的一个组件
           
       
   )
</script>
 
 
6.组件的命名规则:
       如果组件名字当中包含大写字母需要将其改为小写并以-分割。
 
7.单向数据流
   实例可以向组件进行传递,通过属性(props)   
      但是 通过属性给组件传递的数据,在组件内是不允许直接修改的。
实例:     
        <body>
         <div id="myApp">
             <p>myApp:a</p>
             <one num="12" age="13"></one>
         </div>
    </body>
    <script>
         new Vue(
             el:"#myApp",
             data:
                  a:1
             ,
             components:
                  one:
                       //将你要接收的数据进行设置
                       props:["num","age"]
                       temtemplate:‘<div> num  age</div>‘
                       
                 
             
         )
 
8属性传值:
       向下传值通过属性: a.数据的传递是单向的
                         b.如果要修改数据的话,可以通过父级向组件传递一个函数,通过该函数对你的数据进行修改。
 
9. 组件vue实例当中的data与vue实例当中的data定义是有 区别的。
      data是一个函数,该函数必须要有一个返回值,返回值必须要是一个对象。
        为了要保证你子组件当中数据的独立性。
 
10. 组件嵌套
</body>
<script>
    new Vue(
        el:"#myApp",
        components:
            one:
                template:`<div>one <two></two></div>`,
                components:
                    two:
                        template:`<div>two</div>`
                    
                
            
        
    )
</script>
 
11.组件与v-for    遍历
<body>
<div id="myApp">
    <goods-list v-for="item in arr" :info="item"></goods-list>
</div>
</body>
<script>
    new Vue(
        el:"#myApp",
        data:
            arr:[
                
                    goodsTitle:"栗子",
                    goodsPrice:12
                ,
                
                    goodsTitle:"地板",
                    goodsPrice:34
                
            ]
        ,
        components:
            goodsList:
                props:["info"],
                template:`<div>
                    <h3>info.goodsTitle</h3>
                    <p>info.goodsPrice</p>
                </div>`
            
        
    )
</script>
 
12.动态组件
    <!--动态组件  is属性的值即是所选用的组件名-->
    <components :is="comArr[index]"></components>
 
案例说明:
 
<body>
<div id="myApp">
    <input type="button" @click="changeIndex" value="换肤">
    <!--动态组件  is属性的值即是所选用的组件名-->
    <components :is="comArr[index]"></components>
</div>
</body>
<script>
    const one =
        template:`<div style="background:red;">one</div>`
    ;
    const two =
        template:`<div style="background:yellow;">two</div>`
    ;
    const three =
        template:`<div style="background:pink;">three</div>`
    ;
    const four =
        template:`<div style="background:deeppink;">four</div>`
    ;
    new Vue(
        el:"#myApp",
        data:
            index:0,
            comArr:["one","two","three","four"]
        ,
        methods:
            changeIndex()
                this.index++;
                if(this.index>this.comArr.length-1)
                    this.index=0;
            
        ,
        components:
            one,
            two,
            three,
            four
        
    )
</script>
 
重点知识点归纳:
1、template有三种使用方法
    1、直接赋值
        template:`<div>1</div>`
    2、通过script标签来定义
        <script type="x/template" id="tp">
            <div>2</div>
        </script>
        template:"#tp"
    3、使用内置组件template
        <template id="my">
            <div>3</div>
        </template>
        template:"#my"
2.定义组件    局部组件   全局组件
 
局部组件:
      new Vue(
      components:
        one:
                子组件如何接收:
            //将你要接收的数据进行设置
                       props:["num","age"]
        template:`<div>one组件当中</div>`
                
          
    )
全局组件:
    Vue.component(componentName,config) //第一个参数是你组件的名字,第二个是给件的配置项
 
 
3.动态组件:<!--动态组件  is属性的值即是所选用的组件名-->
    <components :is="组件名[index]"></components>
 
4.es6模块化:
    如何导出: export const 
    如何引入:script 引入  通过import
 
5. 向下如何传      子组件如何接收。
                    通过props设置允许接收的属性名:
                  将你要接收的数据进行设置
                           props:["num","age"]

以上是关于0810 vue 创建组件 模板 动态组件 传值的主要内容,如果未能解决你的问题,请参考以下文章

vue利用渲染函数创建弹窗组件,完美支持传值和事件监听

vue父组件向子组件动态传值的两种方法

Vue父子组件之间的传值

Vue父子组件之间的传值

vue父组件向子组件传值

vue02----什么是组件组件创建全局组件局部组件组件嵌套组件传值为什么组件中的data不是一个对象而是一个函数