he-maoke

导航

day42 vue基础04 插槽表达式和组件化

1 VUE 全貌的模板
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
 <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
         
      </div>
    </div>

    <script>
           var app = new Vue({
        el: "#app",
        props: [],
        created() {},
        components:{
            
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
          name: "Vue.js",
        },

        methods: {
          bbb() {},
          aaa() {},
        },
        computed: {},
        watch: {},
        filters: {},
      });

      
    </script>
  </body>
</html>
2 全局组件以及局部组件
1 组件化开发优点1 非常适合多人开发 每个同事开发不同的模块
2 代码的复用性 2 有些相同模块甚至不同项目都可用用 举例相同项目的不同页面都可以用header模块 但是header模块只开发一次
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <aaa></aaa>
        <bbb></bbb>
      </div>
    </div>
    <script>
        Vue.component('aaa',{
            data:function(){
                return {
                    name:'hello wolrd'
                }
            },
            template:'<div>{{name}}</div>'
        })
        var bbb = {
            template:'<div>我是局部组件</div>'
        }
 var app = new Vue({
        el: "#app",
        props: [],
        created() {},
        components:{  
            bbb    
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
          name: "Vue.js",
        },

        methods: {
          bbb() {},
          aaa() {},
        },
        computed: {},
        watch: {},
        filters: {},
      });  
    </script>
  </body>
</html>

 

2 模板中为什么要return data数据
 
 
为了解释这个谜题 我们看下面这段代码
 
第一种是 vue里面 尤雨溪设计的用法
 function a() {
            return {
                name:'cluo',
                age:18
            }
        }

        let vuecomponent1 = a ()
        let vuecomponent2 = a ()
        let vuecomponent3 = a ()
        vuecomponent1.name = '梅西'
        console.log(vuecomponent1)
        console.log(vuecomponent2)
        console.log(vuecomponent3)
第二种是我们想试验的是否可行的用法
const obj = {
            name:'cluo',
            age:18
        }

        function a(){
            return obj
        }
        let vuecomponent1 = a()
        let vuecomponent2 = a()
        let vuecomponent3 = a()

        vuecomponent1.name ='梅西'
        console.log(vuecomponent1)
        console.log(vuecomponent2)
        console.log(vuecomponent3)

防止变量污染,形成独立的对象

 

3 父子组件传值之父传子
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <child :dfdfdf="day"></child>
      </div>
    </div>
    <script>
        //局部组件
        var child = {
            props:['dfdfdf'],
            template:'<p>{{dfdfdf}}</p>'
        }
      var app = new Vue({
        el: "#app",
        props: [],
        created() {},
        components:{  
            child    
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
          name: "Vue.js",
          day:'星期12345我都给你零花钱'
        },

        methods: {
          bbb() {},
          aaa() {},
        },
        computed: {},
        watch: {},
        filters: {},
      });

      
    </script>
  </body>
</html>
4 父子组件传值之子传父

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
          <child @anlarge-text='bigger'>
          </child>  
          <p :style="{fontSize:fontSize+'px'}">
                aaa
          </p>
    </div>
    <script>
        // 子组件
        var child = {
            template:`<button @click="$emit('anlarge-text',9)">我是一个子组件</button>`
        }
      // 父组件
      var app = new Vue({
        el: "#app",
        props: [],
      
        created() {},
        components:{
            child    
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
         msg:'hello vue',
         fontSize:24
        },

        methods: {
          bbb() {},
          aaa() {},
          bigger(n){
              console.log('进入bigger里面了')
              this.fontSize +=n
          }
        },
        computed: {},
        watch: {},
        filters: {},
      });

      
    </script>
  </body>
</html>
5 vue中dom操作的超好用的语法糖ref
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
   <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
</head>
<body>
    <div id="app">
        <div>
            <p ref='p'>
                我是p标签
            </p>
            <h1 ref='fdfdfdfe'>
                fdfsdfsdfsdf
            </h1>
            <aaa ref='aaa'></aaa>
        </div>
    </div>
    <script>
        Vue.component('aaa', {
            data: function () {
                return {
                    name: 'hello wolrd'
                }
            },
            template: '<h1>{{name}}</h1>'
        })
        var app = new Vue({
            el: "#app",
            props: [],
            created() { },
            components: {
            },
            beforeMount() { },
            //页面渲染完成之后
            mounted() { 
                console.log(this.$refs.p)
                console.log(this.$refs.fdfdfdfe)
                this.$refs.aaa.name ='你好世界'
                console.log(this.$refs.aaa.name  )
            },
            beforeUpdate() { },
            updated() { },
            beforeDestroy() { },
            destroyed() { },
            data: {
                name: "Vue.js",
            },

            methods: {
                bbb() { },
                aaa() { },
            },
            computed: {},
            watch: {},
            filters: {},
        });


    </script>
</body>

</html>
新增两个 新生命周期

  activated(){
  },
  deactivated(){},
7 插槽1 匿名插槽
   <header1>共享单车后台管理</header1>
   <header1>小米手机后台管理</header1>
   <h1>我是主页面的东西 pro商品页面</h1> 
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="./vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
           <aaaa> fgdgfdfg dfg fgd d</aaaa>
      </div>
    </div>

    <script>
       
       Vue.component('aaaa',{
           template:`
           <div>
               <h1>我是上面</h1>
               <slot></slot>
           </div>
           `
       })
      var app = new Vue({
        el: "#app",
        props: [],
        created() {},
        components:{
            
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
          name: "Vue.js",
        },

        methods: {
          bbb() {},
          aaa() {},
        },
        computed: {},
        watch: {},
        filters: {},
      });

      
    </script>
  </body>
</html>
8 具体名字的插槽
实际用法 可用锁死页面的格式 然后传入不同的数据 可用得到完全不同的页面 极大的复用了代码 并且
还可以锁死格式
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
   <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <aaa>
            <h1 slot='header'>slot=header我要往这个里面跳</h1>
              <p>
                没人要的我要跳
              </p> 
            <h1 slot='footer'>slot=footer我要往这个里面跳</h1>
        </aaa>
      </div>
    </div>
    <script>
        Vue.component('aaa',{
            template:`
            
            <div>
             <header>
                 <slot name='header'></slot>
             </header>
             <main>
                 <slot></slot>
             </main>
             <footer>
                <slot name='footer'></slot>
             </footer>
         </div>
            `
        })



    
      var app = new Vue({
        el: "#app",
        props: [],
        created() {},
        components:{      
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
          name: "Vue.js",
        },

        methods: {
          bbb() {},
          aaa() {},
        },
        computed: {},
        watch: {},
        filters: {},
      });

      
    </script>
  </body>
</html>
9 作用域插槽
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <div>
        <aaa>
            <div slot-scope='props'>
                <h1>dfdfdfdfdfdfdfdfdfdf   {{props.text}}</h1>
            </div>
        </aaa>
      </div>
    </div>
    <script>
        Vue.component('aaa',{
            template:`
            <div>
              <slot text='我有个文本 想传给你'></slot>
          </div>
            `
        })
    
      var app = new Vue({
        el: "#app",
        props: [],
        created() {},
        components:{      
        },
        beforeMount() {},
        mounted() {},
        beforeUpdate() {},
        updated() {},
        beforeDestroy() {},
        destroyed() {},
        data: {
          name: "Vue.js",
        },

        methods: {
          bbb() {},
          aaa() {},
        },
        computed: {},
        watch: {},
        filters: {},
      });

      
    </script>
  </body>
</html>

 

posted on 2022-07-29 22:21  hmkyj  阅读(66)  评论(0编辑  收藏  举报