vue如何在html页面更优雅的使用组件化开发

  • Post author:
  • Post category:vue




存在问题

  • 没有实现全局组件的复用,只能在单一页面做逻辑的拆分
  • 传递复杂类型数据到子组件,会出现无法解析语法的问题(解决方案不使用驼峰命名,使用下划线连接可解决)



html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      .headerCom {
        font-size: 24px;
      }
      .header-com-img {
        width: 400px;
        height: 400px;
      }
    </style>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.9/vue.min.js"></script>
    <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.js"></script>
  </head>
  <body>
    <div id="app">
      <header-com
        :user_info="user_info"
        :img_list="img_list"
        name="p-name"
        :title="title"
      />
    </div>
  </body>

  <!-- 头部组件 -->
  <script type="text/html" id="headerCom">
    <div class="headerCom">
      <h1 class="headerCom-title">{{title}}</h1>
      <p>username--{{user_info.username}}</p>
      <p>
        {{inputVal}}--{{name}}
      </p>
      <br />
      <input type="text" v-model="inputVal" />

      <div>
        <img
          v-for="item in img_list"
          :key="item.id"
          class="header-com-img"
          :src="'http://139.9.210.43:5000'+item.url"
          alt=""
        />
      </div>
    </div>
  </script>
  <script type="module" src="index.js"></script>
</html>



index.js

import { headerComOptions } from "./components/headerCom.js";

new Vue({
  el: "#app",
  data() {
    return {
        title:'header',
        img_list : [],
        user_info:{
          username:'wxj'
        }
    };
  },
  components: {
    "header-com": headerComOptions,
  },
  async created() {
      let data = await axios.get("http://139.9.210.43:5000/ceshi/imgs", {
        params: {
          type: "1121",
        },
      });
      // console.log(data.data.data);
      this.img_list = data.data.data;
  },
  methods: {},
});



headerCom.js

/*
 * @Description: 如果是全局组件,最好直接导入css;如果只是当前页使用,建议写到具体页面的css中
 */
// // js中引入一个css文件 建议在全局组件中使用
// var css = document.createElement('link');
// css.rel = 'stylesheet';
// css.href = './headerCom.css';
// document.head.appendChild(css);

// 组件的具体逻辑
// let el_template = document.querySelector("#headerCom")?.innerHTML;
let el_template = headerCom?.innerHTML;
// console.log(el_template);
let headerComOptions = {
  template: el_template,
  props: {
    title:'',
    user_info:{
      type:Object,
    },
  
    name: {
      type: String,
    },
    img_list: {
      type: Array,
    },
  },
  data() {
    return {
      inputVal: "1212",
    };
  },
};

export { headerComOptions };



版权声明:本文为qq_42451776原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。