欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

vue.js - 2

程序员文章站 2022-04-09 19:01:21
最近开发公司vue前端项目,做一下笔记,偶尔上来查漏补缺 组件操作: 使用flag标识符结合v-if和v-else切换组件 页面结构: Vue实例定义: 使用:is属性来切换不同的子组件,并添加切换动画 组件实例定义方式: 使用component标签,来引用组件,并通过:is属性来指定要加载的组件: ......

最近开发公司vue前端项目,做一下笔记,偶尔上来查漏补缺

组件操作: 

使用flag标识符结合v-ifv-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属性来指定要加载的组件:

 <div id="app">
    <a href="#" @click.prevent="comname='login'">登录</a>
    <a href="#" @click.prevent="comname='register'">注册</a>
    <hr>
    <transition mode="out-in">
      <component :is="comname"></component>
    </transition>
  </div>
  1. 添加切换样式:

 <style>
    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translatex(30px);
    }
​
    .v-enter-active,
    .v-leave-active {
      position: absolute;
      transition: all 0.3s ease;
    }
​
    h3{
      margin: 0;
    }
  </style>

父组件向子组件传值

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

<script>
    // 创建 vue 实例,得到 viewmodel
    var vm = new vue({
      el: '#app',
      data: {
        msg: '这是父组件中的消息'
      },
      components: {
        son: {
          template: '<h1>这是子组件 --- {{finfo}}</h1>',
          props: ['finfo']
        }
      }
    });
  </script>
  1. 使用v-bind或简化指令,将数据传递到子组件中:

<div id="app">
    <son :finfo="msg"></son>
  </div>

子组件向父组件传值

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

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

<son @func="getmsg"></son>
  1. 子组件内部通过this.$emit('方法名', 要传递的数据)方式,来调用父组件中的方法,同时把数据传递给父组件使用

<div id="app">
    <!-- 引用父组件 -->
    <son @func="getmsg"></son>
​
    <!-- 组件模板定义 -->
    <script type="x-template" id="son">
      <div>
        <input type="button" value="向父组件传值" @click="sendmsg" />
      </div>
    </script>
  </div>
​
  <script>
    // 子组件的定义方式
    vue.component('son', {
      template: '#son', // 组件模板id
      methods: {
        sendmsg() { // 按钮的点击事件
          this.$emit('func', 'ok'); // 调用父组件传递过来的方法,同时把数据传递出去
        }
      }
    });
​
    // 创建 vue 实例,得到 viewmodel
    var vm = new vue({
      el: '#app',
      data: {},
      methods: {
        getmsg(val){ // 子组件中,通过 this.$emit() 实际调用的方法,在此进行定义
          alert(val);
        }
      }
    });
  </script>

vue-router

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

<!-- 1. 导入 vue-router 组件类库 -->
  <script src="./lib/vue-router-2.7.0.js"></script>
  1. 使用 router-link 组件来导航

<!-- 2. 使用 router-link 组件来导航 -->
<router-link to="/login">登录</router-link>
<router-link to="/register">注册</router-link>
  1. 使用 router-view 组件来显示匹配到的组件

<!-- 3. 使用 router-view 组件来显示匹配到的组件 -->
<router-view></router-view>
  1. 创建使用vue.extend创建组件

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

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

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

设置路由高亮

设置路由切换动效

在路由规则中定义参数

  1. 在规则中定义参数:

{ path: '/register/:id', component: register }
  1. 通过 this.$route.params来获取路由中的参数:

var register = vue.extend({
      template: '<h1>注册组件 --- {{this.$route.params.id}}</h1>'
    });
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>