vue笔记4

第三次作业

组件有哪几种定义方式

第一种: 使用 Vue.extend 配合 Vue.component 方法

第二种: 直接使用 Vue.component 方法(这种方式比较常用)

第三种: 将Vue.component 方法的template函数放于外部定义(用<template></template>)

组件和template的区别是什么

组件除了包含了模板,还指定了在html中替换的对象,还可以拥有自己的data数据等
template即为模板,是一段html结构,可以用作模板直接引入到页面元素中

为什么组件的data必须是一个function

data返回值是一个对象,当遇到多个同名元素时候,如果data不是function,这些元素会共享同一个对象,如:点击+1按钮,所有文本都会加一;当data是function时,每有一个元素便会生成一个对象,避免了上面那个问题,按钮会和其对应的文本一一绑定。

创建一个vm对象,带有三个子组件,在其视图中添加一个按钮,要求实现点击按钮三组件轮流切换效果

<div id="app">
    <button type="button" @click="turn">turn</button>
    <component :is="flag"></component>
</div>
<script>
    Vue.component("aaa",{
        template: "<h1>aaa</h1>"
    })
    Vue.component("bbb",{
        template: "<h1>bbb</h1>"
    })
    Vue.component("ccc",{
        template: "<h1>ccc</h1>"
    })
    var vm = new Vue({
        el: "#app",
        data: {
            flag: "aaa"
        },
        methods: {
            turn(){
                if (this.flag == "aaa"){
                    this.flag ="bbb";
                }
                else if (this.flag == "bbb") {
                    this.flag ="ccc"
                }
                else{
                    this.flag ="aaa"
                }
            }
        }
    });
</script>

父组件向子组件传值

父组件,可以在引用子组件的时候, 通过 属性绑定(v-bind:) 的形式, 把 需要传递给 子组件的数据,以属性绑定的形式,传递到子组件内部,供子组件使用

    <com1 v-bind:parentmsg="msg"></com1>
      data: { 
        msg: '父组件中的数据'
      },
      components: {
        com1: {
          data() { 
            return {
              title: '123',
              content: 'qqq'
            }
          },
          template: '<h1 @click="change">这是子组件 --- {{ parentmsg }}</h1>',
          props: ['parentmsg'],
        }
      }

data与props区别

子组件中的 data 数据,并不是通过父组件传递过来的,而是子组件自身私有的,比如: 子组件通过 Ajax ,请求回来的数据,都可以放到 data 身上
data 上的数据,都是可读可写的

组件中的 所有 props 中的数据,都是通过 父组件传递给子组件的
props 中的数据,都是只读的,无法重新赋值

子组件通过事件调用向父组件传值

父组件向子组件传递方法,使用的是事件绑定机制; v-on, 当我们自定义了 一个 事件属性之后,那么,子组件就能够,通过某些方式来调用 传递进去的这个方法了

    <com2 @func="show"></com2>
  <template id="tmpl">
    <div>
      <h1>这是 子组件</h1>
      <input type="button" value="这是子组件中的按钮 - 点击它,触发 父组件传递过来的 func 方法" @click="myclick">
    </div>
  </template>
    var com2 = {
      template: '#tmpl', 
      data() {
        return {
          sonmsg: { name: '小头儿子', age: 6 }
        }
      },
      methods: {
        myclick() {
          this.$emit('func', this.sonmsg)
        }
      }
    }

当点击子组件的按钮的时候,拿到父组件传递过来的 func 方法,并调用emit方法

    var vm = new Vue({
      el: '#app',
      data: {
        datamsgFormSon: null
      },
      methods: {
        show(data) {
          this.datamsgFormSon = data
        }
      },

      components: {
        com2
      }
    });

使用ref获取DOM元素和组件引用

    <input type="button" value="获取元素" @click="getElement" ref="mybtn">
    <h3 id="myh3" ref="myh3">哈哈哈, 今天天气太好了!!!</h3>
    <hr>
    <login ref="mylogin"></login>
      console.log(this.$refs.myh3.innerText)
      console.log(this.$refs.mylogin.msg)
      this.$refs.mylogin.show()

前端路由和后端路由

后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源。
前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时。hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现
在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由)

路由的基本使用方式

    <a href="#/login">登录</a>
    <a href="#/register">注册</a>
    <router-view></router-view>
    var login = {
        template: "<h1>登录组件</h1>"
    }
    var register = {
        template: "<h1>注册组件</h1>"
    }
    var routerObj = new VueRouter({
        routes:[
            {path:'/login', component: login},
            {path: '/register',component: register}
        ]
    });

    var vm = new Vue({
        el: "#app",
        data:{},
        methods:{},
        router:routerObj
    });

router-link

router-link 默认渲染为一个a 标签
tag可以更改默认的渲染方式

    <router-link to="/login" tag="span">登录</router-link>
    <router-link to="/register">注册</router-link>

路由redirect重定向(加载时显示)

{ path: '/', redirect: '/login' }

路由显示设置高亮

第一种,直接设置router-link-active (class)
第二种,
在这里插入图片描述
可通过下方的代码并同时设置myactive属性即可设置点击时的高亮效果

    var routerObj = new VueRouter({
      routes: [ // 路由匹配规则 
        { path: '/login', component: login },
        { path: '/register', component: register }
      ],
      linkActiveClass: 'myactive'
    })

路由切换启动动画

    <transition mode="out-in">
      <router-view></router-view>
    </transition>
    .v-enter,
    .v-leave-to {
      opacity: 0;
      transform: translateX(140px);
    }

    .v-enter-active,
    .v-leave-active {
      transition: all 0.5s ease;
    }

路由规则传参1(query方式)

<router-link to="/login?id=10&name=zs">登录</router-link>
    var login = {
      template: '<h1>登录 --- {{ $route.query.id }} --- {{ $route.query.name }}</h1>',
      data(){
        return {
          msg: '123'
        }
      },
      created(){ // 组件的生命周期钩子函数
        // console.log(this.$route)
        // console.log(this.$route.query.id)
      }
    }

路由传参2(params方式 :id)

    var router = new VueRouter({
      routes: [
        { path: '/login/:id/:name', component: login },
        { path: '/register', component: register }
      ]
    })
<router-link to="/login/12/ls">登录</router-link>

获取参数的方式:

console.log(this.$route.params.id)

子路由

可用children来设置子路由

    var router = new VueRouter({
      routes: [
        {
          path: '/account',
          component: account,
          children: [
            { path: 'login', component: login },
            { path: 'register', component: register }
          ]
        }
      ]
    })
  <template id="tmpl">
    <div>
      <h1>这是 Account 组件</h1>

      <router-link to="/account/login">登录</router-link>
      <router-link to="/account/register">注册</router-link>

      <router-view></router-view>
    </div>
  </template>
  <div id="app">

    <router-link to="/account">Account</router-link>

    <router-view></router-view>

  </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值