Vue进阶

Vue组件化

局部注册与全局注册

组件的使用分为三个步骤:

  • 创建组件构造器:调用Vue.extend( )方法
  • 注册组件: 调用Vue.component( )方法
  • 使用组件:在Vue实例的作用范围内使用组件

全局注册

<body>
  <div id="app">
<!--      3.使用组件-->
    <my-cpn-c></my-cpn-c>
    <my-cpn-c></my-cpn-c>
    <my-cpn-c></my-cpn-c>
  </div>
  <script type="text/javascript" src="../js/vue.js"></script>
  <script>
    //1.创建组件构造器对象
    const cpnC = Vue.extend({
      template: `
        <div>
            <h2>翻滚吧!</h2>
            <h3>憨八龟</h3>
        </div>
`
    })
    //2.注册组件(全局注册)
    Vue.component('my-cpn-c',cpnC)

    new Vue({
      el: '#app'
    })
  </script>
</body>

局部注册

<body>
  <div id="app">
<!--      3.使用组件-->
      <cpn></cpn>
      <cpn></cpn>
      <cpn></cpn>
  </div>
  <script type="text/javascript" src="../js/vue.js"></script>
  <script>
    //1.创建组件构造器对象
    const cpnC = Vue.extend({
      template: `
        <div>
            <h2>翻滚吧!</h2>
            <h3>憨八龟</h3>
        </div>
`
    })
    new Vue({
      el: '#app',
        components:{
          cpn: cpnC //2.注册组件,(局部注册)
        }
    })
  </script>
</body>

父组件与子组件

<body>
  <script type="text/javascript" src="../js/vue.js"></script>
  <div id="app">
    <father></father>
    <father></father>
    <father></father>
  </div>
  <script>
    const son = Vue.extend({
      template:`
        <h3>我是儿子</h3>
      `
    })
    const father = Vue.extend({
      template:`
        <div>
            <h1>我是爸爸</h1>
            <son></son>
        </div>
      `,
      components:{
        son: son
      }
    })
    new Vue({
      el: '#app',
      components:{
        father:father
      }
    })
  </script>
</body>

注意子组件在父组件之前定义,否则可能会出现找不到情况

组件注册的语法糖

省略 Vue.extend( )步骤

局部注册

<body>
  <div id="app">
    <cpn01></cpn01>
  </div>
  <script type="text/javascript" src="../js/vue.js"></script>
  <script>
    new Vue({
      el: '#app',
      components:{
        cpn01:{
          template: `
          <div>
            <h1>我是一个小小的组件</h1>
            <h2>我木的感情</h2>
          </div>
          `
        }
      }
    })
  </script>
</body>

全局注册

组件模板抽离方法

<body>
  <script type="text/javascript" src="../js/vue.js"></script>
<!--  方式一-->
    <script type="text/x-template" id="cpn01">
        <div>
            <h1>你可给我滚吧!</h1>
        </div>
    </script>
<!--  方式二-->
    <template id="cpn02">
        <div>
            <h1>你滚蛋!</h1>
        </div>
    </template>
    <div id="app">
        <cpn01></cpn01>
        <cpn02></cpn02>
    </div>
    <script>
        Vue.component('cpn01',{
            template:'#cpn01'
        })
        Vue.component('cpn02',{
            template:'#cpn02'
        })
        new Vue({
            el:'#app'
        })
    </script>
</body>

组件数据

组件是一个单独功能模块的封装,这个模块有属于自己的HTML模板,也应该有属性自己的数据data:组件不能直接访问Vue实例中的data

如果能直接访问,数据都放在Vue实例的data中,就会变得十分臃肿

Vue组件有自己保存数据的地方

<body>
  <script type="text/javascript" src="../js/vue.js"></script>
  <div id="app">
    <e1></e1>
  </div>
  <script>
    Vue.component('e1',{
      template:`
      <div><h1>{{msg}}</h1></div>
      `,
      data() {
        return {
          msg:'变身!迪迦!'
        };
      }
    })
    new Vue({
      el:'#app'
    })
  </script>
</body>

在注册组件时为组件注册数据

父子组件之间的通信

  • 父传子:通过props向子组件传递数据
  • 子传父:通过事件向父组件发送消息

image-20210817093006596

父传子

<body>
  <script type="text/javascript" src="../js/vue.js"></script>
  <div id="app">
      <cpn :cname="name" :cgender="gender"></cpn>
  </div>
  <template id="test" >
      <div>
          <h1>{{cname}}</h1>
      </div>
  </template>
  <script>
    const cpn = Vue.extend({
      template:'#test',
        //1.第一种方式
        // props:['cname','cgender'],
        props:{
          //2.第二种方式:指定类型
          // cname:String,
          //   cgender:String
            //3.第三种方式:指定默认值
            cname:{
                type:String,         //类型
                default:'默认是大佬',  //指定默认值
                required:true        //变量必传
            }
            //4.还有一些其他写法,不过多赘述......
        }
    })
    new Vue({
      el:'#app',
      data:{
          name:'关云长',
          gender:'男'
      },
      components:{
        cpn:cpn
      }
    })
  </script>
</body>

props支持的默认数据类型有以下几种:,也可以自定义类型

image-20210817112856471

<cpn id = "cpn" :c-name="name"></cpn>

注意使用组件时,如果props变量名设为驼峰式,这里要做一下驼峰转化例如:cName ==> c-name

子传父

<body>
    <script type="text/javascript" src="../js/vue.js"></script>
    <div id="app">
        <cpn @item-click="fatherClick"></cpn>
    </div>
    <template id="cpn">
        <div>
            <li v-for="(item,index) in list">
                <button @click="btnClick(item)">{{item}}</button>
            </li>
        </div>
    </template>
    <script>
        const cpn = Vue.extend({
            template: "#cpn",
            methods:{
                btnClick(item){
                    this.$emit('item-click',item)
                }
            },
            data(){
                return{
                    list:['蜻蜓队长','铁甲小宝','金龟太郎']
                }
            }
        })
        new Vue({
            el:"#app",
            components:{
                cpn:cpn
            },
            methods: {
                fatherClick(temp){
                    alert('父组件说:'+temp)
                }
            }
        })
    </script>
</body>

插槽solt

  • 组件的插槽是为了让我们封装的组件更加具有扩展性
  • 让使用者可以决定组件内部的一些内容到底展示什么

在vue-cli项目中使用插槽slot

默认插槽

runtime-compiler与runtime-only的区别

vue程序运行过程

image-20211008091832284

template——>ast(抽象语法树)——>render函数——>virtual dom(虚拟dom)——>UI(真实dom)

image-20211008092239395

runtime-only 1.性能更高 2.代码量更少

Webpack打包工具

安装:

npm install webpack@3.6.0 -g

查看版本:

webpack --version

打包

webpack /src/main.js /dist/bundle.js

创建配置文件 webpack.config.js

module.exports = {
    entry:'./src/main.js',
    output:{
        path:'E:\\soft\\webStom\\workspace\\VueTest-Plus\\webpack的使用\\dist',
        filename:'bundle.js'
    }
}

局部安装

cd 进入对应目录,执行命令

npm install webpack@3.6.0 --save-dev

局部安装的目的是:项目发布后,别人拉取下来,可以使用局部安装的webpack 进行打包,不会因为webpack版本不一造成打包失败的情况

使用局部webpack打包方式:

package.json中定义自定义脚本

"scripts": {
    "build": "webpack"
  }

然后使用npm run build命令打包,注意直接使用webpack打包的话,默认是使用全局的webpack
pace\VueTest-Plus\webpack的使用\dist’,
filename:‘bundle.js’
}
}


局部安装

cd 进入对应目录,执行命令

npm install webpack@3.6.0 --save-dev


局部安装的目的是:项目发布后,别人拉取下来,可以使用局部安装的webpack 进行打包,不会因为webpack版本不一造成打包失败的情况

使用局部webpack打包方式:

package.json中定义自定义脚本

```js
"scripts": {
    "build": "webpack"
  }

然后使用npm run build命令打包,注意直接使用webpack打包的话,默认是使用全局的webpack

本科计算机bi-ye-she-ji辅导,远程安装运行+部署,欢迎各位小伙伴打扰~企鹅号:298-150-5753

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值