Vue中的组件以及路由

  • 模块化是一种思想,一种构建方式,把一种很复杂的事务拆分成一个一个小模块,然后通过某种特定的方式把这些 小模块组织到一起相互协作完成这个复杂的功能。
  • 在程序中也是一样的,之前学习的 JavaScript 模块化,不要在一个文件中写大量的代码
  • 在 Vue 中,组件就是用来封装视图的,说白了就是封装 HTML
  • 组件思想就是把一个很大的复杂的 Web 页面视图给拆分成一块一块的组件视图,然后利用某种特定的方式把它们组织到一起完成完整的 Web 应用构建。
    • HTML 结构
    • CSS 样式
    • JavaScript 行为
  • 为什么把视图给组件化拆成一块一块的呢?
    • 开发效率
    • 可维护性
    • 其次才是可重用
  • 说白了, 组件就是对局部视图的封装

全局组件定义的三种方式

  1. 使用 Vue.extend 配合 Vue.component 方法:

    var login = Vue.extend({
    template: ‘

    登录


    });
    Vue.component(‘login’, login);

  2. 直接使用 Vue.component 方法:

    Vue.component(‘register’, {
    template: ‘

    注册


    });

  3. 将模板字符串,定义到script标签种:

<script id="tmpl" type="x-template">
      <div><a href="#">登录</a> | <a href="#">注册</a></div>
    </script>

同时,需要使用 Vue.component 来定义组件:

Vue.component('account', {
      template: '#tmpl'
    });

注意: 组件中的DOM结构,有且只能有唯一的根元素(Root Element)来进行包裹!

组件中展示数据和响应事件

  1. 在组件中,data需要被定义为一个方法,例如:

    Vue.component(‘account’, {
    template: ‘#tmpl’,
    data() {
    return {
    msg: ‘大家好!’
    }
    },
    methods:{
    login(){
    alert(‘点击了登录按钮’);
    }
    }
    });

  2. 在子组件中,如果将模板字符串,定义到了script标签中,那么,要访问子组件身上的data属性中的值,需要使用this来访问;

使用components属性定义局部子组件

  1. 组件实例定义方式:
<script>
    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {},
      components: { // 定义子组件
        account: { // account 组件
          template: '<div><h1>这是Account组件{{name}}</h1><login></login></div>', //

在这里使用定义的子组件
components: { // 定义子组件的子组件
login: { // login 组件
template: “

这是登录组件


}
}
}
}
});

  1. 引用组件:
<div id="app">
    <account></account>
  </div>

使用flag标识符结合v-if和v-else切换组件

  1. 页面结构:
<div id="app">
    <input type="button" value="toggle" @click="flag=!flag">
    <my-com1 v-if="flag"></my-com1>
    <my-com2 v-else="flag"></my-com2>
  </div>
  1. Vue实例定义:
<script>
    Vue.component('myCom1', {
      template: '<h3>奔波霸</h3>'
    })

    Vue.component('myCom2', {
      template: '<h3>霸波奔</h3>'
    })

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {
        flag: true
      },
      methods: {}
    });
  </script>

使用:is属性来切换不同的子组件,并添加切换动画

  1. 组件实例定义方式:

    // 登录组件

const login = Vue.extend({
template: <div> <h3>登录组件</h3> </div>
});
Vue.component(‘login’, login);

    // 注册组件
    const register = Vue.extend({
      template: `<div>
        <h3>注册组件</h3>
      </div>`
    });
    Vue.component('register', register);

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: { comName: 'login' },
      methods: {}
    });
  1. 使用component标签,来引用组件,并通过:is属性来指定要加载的组件:

父组件向子组件传值

  1. 组件实例定义方式,注意:一定要使用props属性来定义父组件传递过来的数据

  2. 使用v-bind或简化指令,将数据传递到子组件中:

子组件向父组件传值

  1. 原理:父组件将方法的引用,传递到子组件内部,子组件在内部调用父组件传递过来的方法,同时把要发送给父组件的数据,在调用方法的时候当作参数传递进去;

  2. 父组件将方法的引用传递给子组件,其中,getMsg是父组件中methods中定义的方法名称,func是子组件调用传递过来方法时候的方法名称

    <son @func=“getMsg”>

  3. 子组件内部通过this.$emit(‘方法名’, 要传递的数据)方式,来调用父组件中的方法,同时把数据传递给父组件使用

评论列表案例

目标:主要练习父子组件之间传值

使用 this.$refs 来获取元素和组件

  <div id="app">
    <div>
      <input type="button" value="获取元素内容" @click="getElement" />
      <!-- 使用 ref 获取元素 -->
      <h1 ref="myh1">这是一个大大的H1</h1>

      <hr>
      <!-- 使用 ref 获取子组件 -->
      <my-com ref="mycom"></my-com>
    </div>
  </div>

  <script>
    Vue.component('my-com', {
      template: '<h5>这是一个子组件</h5>',
      data() {
        return {
          name: '子组件'
        }
      }
    });

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {
        getElement() {
          // 通过 this.$refs 来获取元素
          console.log(this.$refs.myh1.innerText);
          // 通过 this.$refs 来获取组件
          console.log(this.$refs.mycom.name);
        }
      }
    });
  </script>

什么是路由

所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;

在 vue 中使用 vue-router

  1. 导入 vue-router 组件类库:

  2. 使用 router-link 组件来导航

    登录
    注册

  3. 使用 router-view 组件来显示匹配到的组件

  4. 创建使用Vue.extend创建组件

     // 4.1 使用 Vue.extend 来创建登录组件
     var login = Vue.extend({
       template: '<h1>登录组件</h1>'
     });
    
     // 4.2 使用 Vue.extend 来创建注册组件
     var register = Vue.extend({
       template: '<h1>注册组件</h1>'
     });
    
  5. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则

    // 5. 创建一个路由 router 实例,通过 routers 属性来定义路由匹配规则
    var router = new VueRouter({
    routes: [
    { path: ‘/login’, component: login },
    { path: ‘/register’, component: register }
    ]
    });

  6. 使用 router 属性来使用路由规则

    // 6. 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
    el: ‘#app’,
    router: router // 使用 router 属性来使用路由规则
    });

设置路由高亮

设置路由切换动效

在路由规则中定义参数

  1. 在规则中定义参数:

    { path: ‘/register/:id’, component: register }

  2. 通过 this.$route.params来获取路由中的参数:

    var register = Vue.extend({
    template: ‘

    注册组件 — {{this.$route.params.id}}


    });

使用 children 属性实现路由嵌套

  <div id="app">
    <router-link to="/account">Account</router-link>

    <router-view></router-view>
  </div>

  <script>
    // 父路由中的组件
    const account = Vue.extend({
      template: `<div>
        这是account组件
        <router-link to="/account/login">login</router-link> | 
        <router-link to="/account/register">register</router-link>
        <router-view></router-view>
      </div>`
    });

    // 子路由中的 login 组件
    const login = Vue.extend({
      template: '<div>登录组件</div>'
    });

    // 子路由中的 register 组件
    const register = Vue.extend({
      template: '<div>注册组件</div>'
    });

    // 路由实例
    var router = new VueRouter({
      routes: [
        { path: '/', redirect: '/account/login' }, // 使用 redirect 实现路由重定向
        {
          path: '/account',
          component: account,
          children: [ // 通过 children 数组属性,来实现路由的嵌套
            { path: 'login', component: login }, // 注意,子路由的开头位置,不要加 / 路径符
            { path: 'register', component: register }
          ]
        }
      ]
    });

    // 创建 Vue 实例,得到 ViewModel
    var vm = new Vue({
      el: '#app',
      data: {},
      methods: {},
      components: {
        account
      },
      router: router
    });
  </script>

命名视图实现经典布局

  1. 标签代码结构:

  2. JS代码:

  3. CSS 样式:

watch属

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值