Vue入門筆記(2)

五、Vue中動畫

六、Vue中組件

組件分爲全局組件和私有組件,將組件定義在vue實例中components就是私有組件。

組件創建

創建方式以全局組件創建方式爲例進行說明

  1. 方式1
<script>
  //1、定義組件對象
  var com1 = Vue.extend({
      template:'<h3>Vue.extend創建組件--{{ pmsg }}</h3>',
      data: function() {//此處data必須是一個函數且返回值必須是對象,該數據是組件私有的且可讀可寫的
          return {pmsg:"組件中私有數據哈哈"}
      },
      methods : {
          function_name:function() {
              this.pmsg='更新了私有數據呵呵';
          },
          function_name2() {
          }
      }
  })
  //2、註冊組件 註冊時可以是駝峯命名 參數1是組件名稱,參數2是組件對象
  Vue.component('myCom1', com1)
</script>
  //3、使用
  <div> 
  	<my-com1></my-com1> <!-- 因爲註冊的時候 用的是駝峯命名所以要用"-"鏈接 -->
  </div>
  1. 方式2
    實際上是創建了一個匿名組件對象
<script>
    Vue.component('mycom2', {
  		template:'<h3>Vue.extend創建組件</h3>',
		data: function() {//此處data必須是一個函數且返回值必須是對象,該數據是組件私有的且可讀可寫的
			return {pmsg:"組件中私有數據哈哈"}
		},
		methods : {
		    function_name:function() {
		        this.pmsg='更新了私有數據呵呵';
		    },
		    function_name2() {
		    }
		}
    })
</script>
<div> 
<mycom2></mycom2>
</div>
  1. 方式3
    將template標籤關聯到template屬性下
<body>
<template id="temp1">
    <h3>Vue.extend創建組件</h3>
</template>
<script>
Vue.component('mycom2', {
   template:'#temp1',
   data:function() {},
   methods: {}
})
</script>
</body>

組件間切換

組件間切換可以通過:
1、通過v-if和v-else指令控制
2、使用Vue提供component標籤

<body>
<h1>Vue Component 標籤</h1>
<hr>
<div id="app">
    <component-a></component-a>
    <component-b></component-b>
    <hr>
    <component v-bind:is="who"></component>
    <button @click="changeComponent">我變換</button>
</div>
<script>
    var componentA = {
        template:`<div style="color:red">我是 componentA</div>`
    }
    var componentB = {
        template:`<div style="color:green">我是 componentB</div>`
    }
    var app = new Vue({
        el:'#app',
        data:{
            who:'componentA'
        },
        components:{
            'componentA':componentA,
            'componentB':componentB
        },
        methods:{
            changeComponent:function(){
                if(this.who=='componentA'){
                    this.who='componentB'
                }else{
                    this.who='componentA'
                }
            }
        }
    })
</script>

組件間傳值

數據傳遞

可以通過v-bind以及props屬性進行,數據的傳遞
步驟1、通過自定義屬性綁定,將父組件數據傳給遞到子組件中

<div id="app">
    <!-- 其中parentmsg是自定義名字 -->
    <com1 v-bind:parentmsg="pmsg"></com1>
</div>

在子組件中props屬性中增加,自定義屬性。父組件數據傳遞給子組件是隻讀的

<script>
    var vm=new Vue({
        el:'#app',
        data:{
            pmsg:'123 父組件中的數據'
        },
        methods:{},
        components: {
            'com1': {
                template : '<h1>這是子組件 -- {{ parentmsg }}</h1>',
                props:['parentmsg'] //在props中增加自定義屬性名字
            }
        }
    });
</script>

方法傳遞,父子間雙向傳遞

方法的傳遞通過v-on,如下所示:

<body>
    <div id="app">
        <!-- 這裏func123是自定義的屬性名字 -->
        <com2 v-on:func123="show"></com2>
    </div>
    <template id="temp1">
        <div>
            <h1>這是子組件</h1>
            <input type="button" value="子組件 調用父組件的function對象" @click="myClick">
        </div>
    </template>
    <script>
        var com2 = {
            template:"#temp1",
            methods: {
                myClick() {
                    //this代表com2對象 即子組件  func123代表父組件中的方法
                    //通過emit調用父組件函數
                    //向父組件傳遞數據
                    this.$emit('func123', '父組件函數 形參1');
                }
            },
        };

        var vm=new Vue({
            el:'#app',
            data:{},
            methods:{
                show(data) {
                    console.log("父組件的show方法:" + data);
                }
            },
            components: {
                com2
                //等於 'com2':com2
            }
        });
    </script>
</body>

七、Vue獲取DOM元素\組件

獲取DOM元素

使用方法:
1<p ref="pname"></p>
2this.$refs.pname.innerText

獲取組件

使用方法:
1<mycom ref="pname"></mycom> <!-- 其中mycom是自定義的組件 -->
2this.$refs.pname.function_name()

八、Vue路由

相關說明

前端路由:在單頁面應用程序中,通過hash(#號表示,如錨點鏈接)來切換頁面的方式,稱爲前端路由。
路由作用:常用於組件間切換
依賴庫: vue-router.js
使用方法:當導入vue-router.js後在window全局對象中就有一個路由的構造函數–VueRouter

使用

<div id="app">
    <!-- 
    <a href="#/login">login</a>
    <a href="#/register">register</a> 
    -->
    <!-- 等同上面兩個超鏈接 router-link默認渲染成a標籤,可以通過tag來指定渲染標籤 -->
    <router-link to="/login" tag="span">login</router-link>
    <router-link to="/register">register</router-link>
    <router-view></router-view> <!-- 用於顯示組件 相當於佔位符 -->
</div>
<script>
var com_login = {
    template:'<h1>登錄組件</h1>'
}
var com_register = {
    template:'<h1>註冊組件</h1>'
}
var routerObject = new VueRouter({
    routes : [//routes代表路由匹配規則
        {//默認顯示根路徑後 強制 重定向到login
            path:'/', //監聽的路由地址
            redirect: '/login' //重定向
        },
        {
            path:'/login', //監聽的路由地址
            component: com_login //組件模板對象,不能是組件的名稱
        },
        {
            path:'/register', //監聽的路由地址
            component: com_register //組件模板對象,不能是組件的名稱
        }
    ]
});
</script>

路由傳值

路由傳值支持兩種方式:query(?)和佔位符(:)方式

query方式–即?方式

<div id="app">
    <router-link to="/login?myid=10&name=abc" tag="span">login</router-link>
    <router-link to="/register">register</router-link>
    <router-view></router-view>
</div>
<script>
var com_login = {
    //插值表達式中this可省  通過$route.query訪問?後面的參數
    template:'<h1>登錄組件---{{ this.$route.query.myid }}</h1>',
    created() {
        console.log(this.$route);//表示路徑對象
        console.log(this.$router);//表示路由對象 即VueRouter
        console.log(this);//表示組件對象 即VueComponent
    }
}
</script>

佔位符方式–即:方式

<div id="app">
    <router-link to="/login/10">login</router-link>
    <router-link to="/register">register</router-link>
    <router-view></router-view>
</div>
<script>
var com_login = {
    //插值表達式中this可省 通過$route.params訪問參數 Vue底層通過正則匹配方式設置參數
    template:'<h1>登錄組件---{{ this.$route.params.id }}</h1>',
    created() {
        console.log(this.$route);//表示路徑對象
        console.log(this.$router);//表示路由對象 即VueRouter
        console.log(this);//表示組件對象 即VueComponent
    }
}
var routerObject = new VueRouter({
    routes : [//routes代表路由匹配規則
        {//默認顯示根路徑後 強制 重定向到login
            path:'/', //監聽的路由地址
            redirect: '/login' //重定向
        },
        {
            path:'/login/:id', //通過佔位符:方式
            component: com_login
        },
        {
            path:'/register',
            component: com_register
        }
    ]
});
</script>

路由嵌套

我們可以通過children屬性,爲路由設置子路由

<body>
  <div id="app">
      <router-link to="/account">Account</router-link>
      <router-view></router-view>
  </div>
  <template id="temp1">
      <div>
          <h1>這個是Account組件</h1>
          <router-link to="/account/login">登錄</router-link>
          <router-link to="/account/register">註冊</router-link>
          <router-view></router-view> <!-- 必須的 用於顯示子路由 -->
      </div>
  </template>
  <script>
      var account = {
          template:"#temp1"
      }
      var login = {
          template:"<h3>登錄</h3>"
      }
      var register = {
          template:"<h3>註冊</h3>"
      }
      var myRouter = new VueRouter({
          routes: [
              {
                  path: "/account", 
                  component: account, 
                  children: [//子路由中的path不要以/開始
                      {path: "login", component: login},
                      {path: "register", component: register}
                  ]
              }
          ]
      });

      var vm=new Vue({
          el:'#app',
          data:{},
          methods:{},
          router: myRouter
      });
  </script>
</body>

路由命名視圖

當一個頁面有需要顯示多個組件,我們可以通過爲標籤router-view指定name屬性來顯示設置組件

<body>
    <div id="app">
        <router-view></router-view> <!-- 沒有指定 默認使用default -->
        <div class="container">
            <router-view name="myLeft"></router-view> <!-- 使用指定名字的組件 -->
            <router-view name="myMain"></router-view>
        </div>
    </div>

    <script>
        var header = {
            template: "<h1 class='header'>header區域</h1>"
        }
        var leftBox = {
            template: "<h1 class='left'>left區域</h1>"
        }
        var mainBox = {
            template: "<h1 class='main'>main主體區域</h1>"
        }
        var myRouter = new VueRouter({
            routes: [
                {
                    path: "/",
                    components: {
                        "default" : header,
                        "myLeft" : leftBox,
                        "myMain" : mainBox
                    }
                }
            ]
        })
        var vm=new Vue({
            el:'#app',
            data:{},
            methods:{},
            router:myRouter
        });
    </script>
</body>

九、其他

=> 箭頭函數(lamba表達式):可以解決this指針指向問題,是內部this和外部this保持一致

methods: {
        start : function() {
            setInterval(() => {
                var startString = this.msg.substring(0, 1)
                var endString = this.msg.substring(1)
                this.msg = endString + startString
            }, 400);
        }
    }
與下面等價
methods: {
        start : function () {
            var _this = this; //現在不這樣寫了
            setInterval(function () {
                var startString = _this.msg.substring(0, 1)
                var endString = _this.msg.substring(1)
                _this.msg = endString + startString
            }, 400);
        }
    }

Vue中按鍵事件
代表監聽所有按鍵事件

<input type="text" class="form-control" v-model='name' @keyup='add'>

監聽回車事件:

<input type="text" class="form-control" v-model='name' @keyup.enter='add'>

Vue默認提供的按鍵事件:enter、tab、delete、esc、up、down、left、right

自定義按鈕事件:

<input type="text" class="form-control" v-model='name' @keyup.f2='add'>
<script>
Vue.config.keyCodes.f2=113 //Vue全局配置
</script>

#Vue提供的標籤:
<component></component>
<template></template>
<transition></transition> — 動畫 過渡
<transitionGroup></transitionGroup>

Vue上一篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章