前端页面全新的写法(第七课)Vue中的组件

简介: 前端页面全新的写法(第七课)Vue中的组件

VueCli框架的实操内容(第七课)Vue中的组件


组件是可复用的 Vue 实例, 把一些公共的模块抽取出来,然后写成单独的的工具组件或者页面,在需要的页面中就直接引入即可那么我们可以将其抽出为一个组件进行复用。例如 页面头部、侧边、内容区,尾部,上传图片,等多个页面要用到一样的就可以做成组件,提高了代码的复用率。

个人观点:Vue组件等价于模块思想

文档内容解释

 

(6条消息) VueCLi的安装步骤(第四课)_星辰镜的博客-CSDN博客

VueCli项目的创建结构图

 

控制器操作自己的页面信息

组件注册 | Vue.js (vuejs.org)

前面我们是将所有的逻辑放到一个App.vue中:


在之前的案例中,我们只是创建了一个组件App;


如果我们一个应用程序将所有的逻辑都放在一个组件中,那么这个组件就会变成非常的臃 肿和难以维护;


所以组件化的核心思想应该是对组件进行拆分,拆分成一个个小的组件;


再将这些组件组合嵌套在一起,最终形成我们的应用程序;


我们来分析一下下面代码的嵌套逻辑,假如我们将所有的代码逻辑都放到一个App.vue组件 中:


我们会发现,将所有的代码逻辑全部放到一个组件中,代码是非常的臃肿和难以维护的。


并且在真实开发中,我们会有更多的内容和代码逻辑,对于扩展性和可维护性来说都是非 常差的。


所以,在真实的开发中,我们会对组件进行拆分,拆分成一个个功能的小组件。

 

 

 

 

组件又是上面三张图的意思 将整个页面分开实现功能 在用组件思想 组合在一起 便于后期期维护


App.vue

  <div class="app">
    <!--!主模块的内容信息 -->
    <h1>主版块的内容信息</h1>
    <!-- 头部 -->
    <header-item  attribute="接收子组件转来的信息" name="张三" age="20" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="李四" age="ASDF" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="王五" age="202" height="111"></header-item>
    <header-item attribute="接收子组件转来的信息"  name="张璐" age="203" height="111"></header-item>
    <!-- 中部 -->
    <banner :info="obj"></banner>
    <!-- 脚步 -->
   <footers class="product" name="我叫张上偶" age="20" id="1001002"></footers>
   <footers :class="$attrs.class " name="我叫张上偶" age="20" id="1001002"></footers>
   <footers class="product" name="我是谁" age="20" id="1001002"></footers>
   <footers class="product" name="我来自哪里" age="20" id="1001002"></footers>
   <mysolt></mysolt>
   <four></four>
   <div></div>
   <vue-sum-egg-five></vue-sum-egg-five>
  </div>
<template>
  <div class="app">
    <!--!主模块的内容信息 -->
    <h1>主版块的内容信息</h1>
    <!-- 头部 -->
    <header-item  attribute="接收子组件转来的信息" name="张三" age="20" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="李四" age="ASDF" height="111"></header-item>
    <header-item  attribute="接收子组件转来的信息" name="王五" age="202" height="111"></header-item>
    <header-item attribute="接收子组件转来的信息"  name="张璐" age="203" height="111"></header-item>
    <!-- 中部 -->
    <banner :info="obj"></banner>
    <!-- 脚步 -->
   <footers class="product" name="我叫张上偶" age="20" id="1001002"></footers>
   <footers :class="$attrs.class " name="我叫张上偶" age="20" id="1001002"></footers>
   <footers class="product" name="我是谁" age="20" id="1001002"></footers>
   <footers class="product" name="我来自哪里" age="20" id="1001002"></footers>
   <mysolt></mysolt>
   <four></four>
   <div></div>
   <vue-sum-egg-five></vue-sum-egg-five>
  </div>
</template>
<script>
import banner from "../src/components/banner.vue";
import footers from '../src/components/footer.vue';
import mysolt from '../src/components/mySoltOne.vue'
import four from '../src/components/four.vue'
import VueSumEggFive from "../src/components/V-X.vue"
// import footer_item from "./footers.vue"
export default { 
  // eslint-disa le-next-line vue/multi-word-component-names
  name: "app",
  data() {
    return {
      message: "Hello world vue cli",
      // 在父模块中定义对象
      obj:{
        id:"1001001",
        name:"我是李四上",
        age:"78",
        height:"178",
        weight:"78",
        color:"red",
        sex:'男'
      }
    };
  },
//   局部注册
  components: {
    banner,
    footers,
    mysolt,
    four,
    // eslint-disable-next-line vue/no-unused-components
    VueSumEggFive
  },
  methods: {
    btnclick() {
      console.log("为难忘");
    },
  },
};
</script>
<style scoped>
*{
    /* background-color: rgb(0, 100, 0); */
    background-color: rgb(151, 219, 178);
    border-top: 4px solid rgb(244, 8, 86) ;
}
h2 {
  background-color: azure;
}
h1 {
  color: rgb(20, 87, 116);
  background-color: rgb(159, 248, 251);
  text-align: center;
}
h3 {
  background-color: antiquewhite;
  color: cyan;
}
</style>

One.vue

import banner from "../src/components/banner.vue";
import footers from '../src/components/footer.vue';
import mysolt from '../src/components/mySoltOne.vue'
import four from '../src/components/four.vue'
import VueSumEggFive from "../src/components/V-X.vue"
// import footer_item from "./footers.vue"
export default { 
  // eslint-disa le-next-line vue/multi-word-component-names
  name: "app",
  data() {
    return {
      message: "Hello world vue cli",
      // 在父模块中定义对象
      obj:{
        id:"1001001",
        name:"我是李四上",
        age:"78",
        height:"178",
        weight:"78",
        color:"red",
        sex:'男'
      }
    };
  },
//   局部注册
  components: {
    banner,
    footers,
    mysolt,
    four,
    // eslint-disable-next-line vue/no-unused-components
    VueSumEggFive
  }
<template>
  <div class="header">
    <div>
      <h1>我是第一模块</h1>
      <h1>我是头部提示信息{{ age }}</h1>
      <h1>{{ message }}{{ name }}___{{ age }}___{{ height }}</h1>
      <h2>我是头部信息</h2>
      <h3>
        <nav><span>11111</span>&nbsp;&nbsp;<span>22222</span></nav>
      </h3>
    </div>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "header",
  // 
  props: {
    age: {
      type: Number,
      required: true,
      default: 18,
    },
  },
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {},
};
</script>
<style scoped>
* {
  font-size: 23px;
  background-color: rgb(17, 96, 123);
  color: white;
}
</style>

Banner.vue

<template>
  <div class="banner">
    <div>
      <h1>Two</h1>
      <h2>我是身体的一部分</h2>
      <ul>
        <!-- 用户转入的对象信息 -->
        <!-- 子模块 -->
        <h4>{{info}}</h4>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.id}}</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.name}}</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.sex}}</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.height}}cm</li>
        <li>&nbsp;&nbsp;我是学生&nbsp;&nbsp;{{info.weight}}kg</li>
      </ul>
      <product class="product"></product>
      <h1>{{count}}</h1>
      <product @sonCom="getSon"  class="product"></product>
    </div>
  </div>
</template>
<script>
import Product from './product.vue';
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "banner",
  props:["info"],
  emits:{
    getSon:function(e){
      return e
    }
  },
  components:{
    Product 
  },
  data() {
    return {
      message: "Hello world vue cli",
      count:0
    };
  },
  methods: {
    btnclick() {
      console.log("为难忘");
    },
    getSon(e){
      if(e){
        this.count--
      }else{
        this.count++
      }
      // console.log(e)
    }
  },
};
</script>
<style scoped>
*{
  font-family: Cambria, Cochin, Georgia, Times, 'Times New Roman', serif;
  font-size: 20px;
  background-color: rgb(4, 117, 77);
  color: rgb(255, 255, 255);
}
</style>

产品组件

<template>
    <div>
    <h1 >学生信息表格</h1>
    <table @click="emits">
      <tr>
        <th>编号</th>
        <th>姓名</th>
        <th>性别</th>
        <th>年龄</th>
        <th>爱好</th>
      </tr>
      <tr>
        <td>1001</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10012</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10012</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10014</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10015</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10016</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10017</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10018</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10019</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
      <tr>
        <td>10010</td>
        <td>李四光</td>
        <td>女</td>
        <td>34</td>
        <td>王者荣耀</td>
      </tr>
    </table>
    <button @click="emitse(false)"> -1</button>
    <button @click="emitse(true)"> +1</button>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "product",
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {
    btnclick() {
      console.log("我是第一条的数据信息内容");
    },
    // 字组件专递个父组件的对象
    emits(flag){
      this.$emit("sonCom",flag)
      // this.$emit("sonCom", 监听事件
      // this.$emit("sonCom",{
        // name:"我叫对象",
        // age:123,
        // height:190,
        // weight:78,
        // sex:"男",
      // })
    }
  },
};
</script>
<style scoped>
*{
    /* background-color: rgb(0, 100, 0); */
    font-family: 'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
    font-size:20px;
    border: 2px solid rgb(125, 193, 232);
    border-bottom: 1px solid rgb(255, 0, 0);
    margin: 2px;
    background-color: rgb(10, 79, 101);
}
table {
  width: 100%;
  border-collapse: collapse;
  margin: auto;
  border: 2px solid rgb(0, 0, 0);
  text-align: center;
}
th td {
  border: 1px solid rgb(255, 0, 0);
}
td{
  background-color: lightblue;
    border-left: 3px solid rgb(255, 166, 0);
   border-bottom: 2px solid rgb(9, 74, 97); 
}
h1{
  text-align: center;
}
</style>

export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "product",
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {
    btnclick() {
      console.log("我是第一条的数据信息内容");
    },
    // 字组件专递个父组件的对象
    emits(flag){
      this.$emit("sonCom",flag)
      // this.$emit("sonCom", 监听事件
      // this.$emit("sonCom",{
        // name:"我叫对象",
        // age:123,
        // height:190,
        // weight:78,
        // sex:"男",
      // })
    }
  }

footer.vue

<template>
  <div class="footers">
    <div>
      <!--  字模块-->
      <h1>{{attribute}}__{{name}}_{{age}}_{{id}}</h1>
      <h2>我是脚本信息</h2>
      <h3>信息脚本</h3>
      <h2>我是动态的脚本信息内容</h2>
    </div>
  </div>
</template>
<script>
export default {
  // eslint-disable-next-line vue/multi-word-component-names
  name: "footers",
  props:["attribute","name","age","id"],
  data() {
    return {
      message: "Hello world vue cli",
    };
  },
  methods: {
    btnclick() {
      console.log("为难忘");
    },
  },
};
</script>
<style scoped>
*{
    background-color: rgb(173, 227, 229);
    color: rgb(6, 6, 6);
    font-size: 20px;
}
</style>

four.vue

<template>
    <div class="four">
    <h1>我是文本的信息内容介绍four</h1>
    </div>
</template>
<script>
export default{
    // eslint-disable-next-line vue/multi-word-component-names
    name:'four',
    data(){
        return{
            message:"Hello world vue cli"
        }
    },
    methods:{
        btnclick(){
            console.log("为难忘")
        }
    }
}
</script>
<style scoped>
*{
    background-color: chartreuse;
}
</style>

mySoltOne.vue

<template>
    <div class="mysolt">
        <h1>开始</h1>
        <slot>
            <h1>我的内容展示</h1>
        </slot>
        <h1>结尾</h1>
    </div>
</template>
<script>
export default{
    // eslint-disable-next-line vue/multi-word-component-names
    name:'mysolt',
    data(){
        return{
        }
    },
    methods:{
    }
}
</script>
<style scoped>
div{
    border-top: 4px solid rgb(13, 71, 96);
    background-color: rgb(255, 140, 0);
    border-radius: 20px;
    font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
    font-size: 24px;
}
</style>

这个项目自己理解一下会对你有帮助 后期会有项目实战

相关文章
|
9天前
|
前端开发 安全 开发工具
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
137 90
【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
25天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
116 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
24 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
6天前
|
前端开发
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
25 1
【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
|
22天前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
73 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
27天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
75 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
27天前
|
JavaScript 前端开发 jenkins
抛弃node和vscode,如何用记事本开发出一个完整的vue前端项目
本文探讨了在不依赖Node和VSCode的情况下,仅使用记事本和浏览器开发一个完整的Vue3前端项目的方法。通过CDN引入Vue、Vue Router、Element-UI等库,直接编写HTML文件实现页面功能,展示了前端开发的本质是生成HTML。虽然日常开发离不开现代工具,但掌握这种基础方法有助于快速实现想法或应对特殊环境限制。文章还介绍了如何用Node简单部署HTML文件到服务器,提供了一种高效、轻量的开发思路。
53 10
|
24天前
|
缓存 前端开发 IDE
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
25 0
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
4月前
|
存储 人工智能 前端开发
前端大模型应用笔记(三):Vue3+Antdv+transformers+本地模型实现浏览器端侧增强搜索
本文介绍了一个纯前端实现的增强列表搜索应用,通过使用Transformer模型,实现了更智能的搜索功能,如使用“番茄”可以搜索到“西红柿”。项目基于Vue3和Ant Design Vue,使用了Xenova的bge-base-zh-v1.5模型。文章详细介绍了从环境搭建、数据准备到具体实现的全过程,并展示了实际效果和待改进点。
304 14

热门文章

最新文章

  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    24
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    43
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    25
  • 4
    巧用通义灵码,提升前端研发效率
    84
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    137
  • 6
    详解智能编码在前端研发的创新应用
    92
  • 7
    智能编码在前端研发的创新应用
    75
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    35
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    111
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    73