Vue學習之組件切換及父子組件小結(八)


一、組件切換:

1、v-if與v-else方式:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>組件</title>
    <script src="./lib/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <a href="" @click.prevent="flag=true">登錄</a>
      <a href="" @click.prevent="flag=false">注冊</a>

      <login v-if="flag"></login>
      <register v-else="flag"></register>
    </div>

    <script>
      Vue.component("login", {
        template: "<h3>登錄組件</h3>"
      });
      Vue.component("register", {
        template: "<h3>注冊組件</h3>"
      });
      var vm = new Vue({
        el: "#app",
        data: {
          flag: true
        },
        methods: {},
        filters: {},
        directives: {}
      });
    </script>
  </body>
</html>

2、組件切換之component方式:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>組件</title>
    <script src="./lib/vue.js"></script>
  </head>
  <body>
    <div id="app">
      <!-- 1.v-if 和v-else方式 -->
      <!-- <a href="" @click.prevent="flag=true">登錄</a>
      <a href="" @click.prevent="flag=false">注冊</a>

      <login v-if="flag"></login>
      <register v-else="flag"></register> -->
      <!-- 2.Vue 提供了 component ,來展示對應名稱的組件 -->
      <!-- component 是一個占位符,:is 屬性,可以用來指定要展示的組件的名稱  -->
      <a href="" @click.prevent="comName='login'">登錄</a>
      <a href="" @click.prevent="comName='register'">注冊</a>
      <component :is="comName"></component>
    </div>

    <script>
      Vue.component("login", {
        template: "<h3>登錄組件</h3>"
      });
      Vue.component("register", {
        template: "<h3>注冊組件</h3>"
      });
      var vm = new Vue({
        el: "#app",
        data: {
          comName: ""
        },
        methods: {},
        filters: {},
        directives: {}
      });
    </script>
  </body>
</html>

3、組件切換之動畫效果:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>組件</title>
    <script src="./lib/vue.js"></script>
    <style>
      .v-enter,
      .v-leave-to {
        opacity: 0;
        transform: translateX(150px);
      }
      .v-enter-active,
      .v-leave-active {
        transition: all 0.8s ease;
      }
    </style>
  </head>
  <body>
    <div id="app">
      <a href="" @click.prevent="comName='login'">登錄</a>
      <a href="" @click.prevent="comName='register'">注冊</a>
      <!-- 通過 mode 屬性,設置組件切換時候的模式 -->
      <transition mode="out-in">
        <component :is="comName"></component>
      </transition>
    </div>

    <script>
      Vue.component("login", {
        template: "<h3>登錄組件</h3>"
      });
      Vue.component("register", {
        template: "<h3>注冊組件</h3>"
      });
      var vm = new Vue({
        el: "#app",
        data: {
          comName: ""
        },
        methods: {},
        filters: {},
        directives: {}
      });
    </script>
  </body>
</html>

 二、父子組件:

1、子組件默認是無法訪問父組件的;

2、父組件V-ON傳遞方法到子組件,子組件需要接收定義到props數組中,才能使用

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>組件</title>
    <script src="./lib/vue.js"></script>
    <style></style>
  </head>
  <body>
    <div id="app">
      <!-- 父組件,可以在引用子組件的時候,通過屬性綁定(v-bind)的形式,
        把需要傳遞給子組件的數據,以屬性綁定的形式,傳遞到子組件內部,
      供子組件使用 -->
      <com1 v-bind:parentmsg="msg"></com1>
    </div>

    <script>
      var vm = new Vue({
        el: "#app",
        data: {
          msg: "這是父組件中的數據"
        },
        methods: {},
        components: {
          // 子組件默認是無法訪問到父組件中的data上的數據和methods中的方法
          com1: {
            data() {
              // 子組件中的data數據,並不是通過父組件傳遞過來的,而是子組件啊自身私有的
              // 比如:子組件通過AJAX,請求回來的數據,都可以放到data身上;
              // data 上的數據,都是可讀可寫的
              return {
                title: "123",
                content: "qqq"
              };
            },
            template: '<h1 @click="change">這是子組件----{{ parentmsg }}</h1>',
            // 組件中的所有 props 中的數據,都是通過父組件傳遞給子組件的
            // props 中的數據,都是可讀的,無法重新賦值
            props: ["parentmsg"],
            // 把父組件傳遞過來的 parentmsg 屬性,先在 props 數組中定義一下,這樣,才能使用這個數據
            directives: {},
            filters: {},
            methods: {
              change() {
                this.parentmsg = "被修改了";
              }
            }
          }
        }
      });
    </script>
  </body>
</html>

3、子組件通過事件調用向父組件傳值:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>組件</title>
    <script src="./lib/vue.js"></script>
    <style></style>
  </head>
  <body>
    <div id="app">
      <com2 @func123="show"></com2>
    </div>
    <template id="tmp1">
      <div>
        <h1>這是子組件</h1>
        <input
          type="button"
          value="這是子組件中的按鈕--點擊它,觸發:父組件傳遞過來的func 方法"
          @click="myclick"
        />
      </div>
    </template>

    <script>
      // 定義一個字面量類型的 組件模板對象
      var com2 = {
        // 通過指定一個ID,表示說,要去加載這個指定ID的 template 元素中的內容
        // 當做組件的HTML結構
        template: "#tmp1",
        data() {
          return {
            sonmsg: { name: "小頭兒子", age: "6" }
          };
        },
        methods: {
          myclick() {
            // emit 觸發、調用、發射
            this.$emit("func123", this.sonmsg);
          }
        }
      };
      var vm = new Vue({
        el: "#app",
        data: {
          datamsgFormSon: null
        },
        methods: {
          show(data) {
            this.datamsgFormSon = data;
            console.log("調用了父組件身上的 show 方法:---" + data);
          }
        },
        components: {
          com2
          // com2:com2
        }
      });
    </script>
  </body>
</html>

 三、使用ref獲取DOM元素和組件引用:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <meta http-equiv="X-UA-Compatible" content="ie=edge" />
    <title>組件</title>
    <script src="./lib/vue.js"></script>
    <style></style>
  </head>
  <body>
    <div id="app">
      <input type="button" value="獲取元素" @click="getElement" ref="mybtn" />
      <h3 id="myh3" ref="myh3">周末也在一直學習</h3>
      <hr />
      <login ref="mylogin"></login>
    </div>

    <script>
      var login = {
        template: "<h1>登錄組件</h1>",
        data() {
          return {
            msg: "son msg"
          };
        },
        methods: {
          show() {
            console.log("調用了子組件的方法");
          }
        }
      };
      var vm = new Vue({
        el: "#app",
        data: {},
        methods: {
          getElement() {
            // console.log(document.getElementById("myh3").innerText);
            // ref --[reference]
            // console.log(this.$refs.myh3.innerText);
            // console.log(this.$refs.mylogin.msg);
            this.$refs.mylogin.show();
          }
        },
        components: {
          login
        }
      });
    </script>
  </body>
</html>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM