vue3开发移动端

一、移动适配

安装依赖

将px转成vh和vw

npm install postcss-px-to-viewport -D

配置 vite.config.ts

因为vite中已经内联了postcss,所以并不需要额外的创建 postcss.config.js文件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import AutoImport from 'unplugin-auto-import/vite'
import postcsspxtoviewport from "postcss-px-to-viewport"

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      imports: ['vue'],
      dts: "src/auto-import.d.ts"
    })
  ],
  css: {
    postcss: {
      plugins: [
        postcsspxtoviewport({
          unitToConvert: 'px', // 要转化的单位
          viewportWidth: 750, // UI设计稿的宽度
          unitPrecision: 6, // 转换后的精度,即小数点位数
          propList: ['*'], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换
          viewportUnit: 'vw', // 指定需要转换成的视窗单位,默认vw
          fontViewportUnit: 'vw', // 指定字体需要转换成的视窗单位,默认vw
          selectorBlackList: ['ignore-'], // 指定不转换为视窗单位的类名,
          minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换
          mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false
          replace: true, // 是否转换后直接更换属性值
          landscape: false // 是否处理横屏情况
        })
      ]
    }
  }
})

注意:若需要声明文件则可以复制以下

// postcss-px-to-viewport.d.ts
declare module 'postcss-px-to-viewport' {
    type Options = {
        unitToConvert: 'px' | 'rem' | 'cm' | 'em',
        viewportWidth: number,
        viewportHeight: number, // not now used; TODO: need for different units and math for different properties
        unitPrecision: number,
        viewportUnit: string,
        fontViewportUnit: string,  // vmin is more suitable.
        selectorBlackList: string[],
        propList: string[],
        minPixelValue: number,
        mediaQuery: boolean,
        replace: boolean,
        landscape: boolean,
        landscapeUnit: string,
        landscapeWidth: number
    }
    // Partial 将参数变为可选
    export default (options: Partial<Options>) => any
}

引入声明文件 postcss-px-to-viewport.d.tsvite.config.ts同级

// tsconfig.json
{
  "extends": "@vue/tsconfig/tsconfig.web.json",
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "postcss-px-to-viewport.d.ts"],
  "exclude": ["src/**/__tests__/*"],
  "compilerOptions": {
    "composite": true,
    "baseUrl": ".",
    "paths": {
      "@/*": ["./src/*"]
    }
  }
}

代码案例

<template>
  <div class="wraps">
    <header>
      <div class="header-left">左边</div>
      <div class="header-middle">中间</div>
      <div class="header-right">右边</div>
    </header>
    <main>
      <div class="main-content" v-for="item in 50">
        <div class="portrait"></div>
        <div class="main-desc">
          <div>名字:{{ item }}</div>
          <div>介绍:我是{{ item }},我要回家吃饭了</div>
        </div>
      </div>
    </main>
    <footer>
      <div class="footer-content" v-for="item in footer">
        <div class="footer-icon">{{ item.icon }}</div>
        <div class="footer-text">{{ item.text }}</div>
      </div>
    </footer>
  </div>
</template>

<script setup lang='ts'>

type Footer<T> = {
  icon: T,
  text: T
}
const footer = reactive<Footer<string>[]>([
  {
    icon: '1',
    text: '首页'
  },
  {
    icon: '2',
    text: '商品'
  },
  {
    icon: '3',
    text: '购物车'
  },
  {
    icon: '4',
    text: '我的'
  }
])

</script>

<style lang='less' scoped>
body,
html,
#app {
  overflow: hidden;
  height: 100%;
  font-size: 14px;
}

header {
  display: flex;
  justify-content: space-around;
  padding: 10px;
  background-color: #4c7cf6;
}

main {
  display: flex;
  flex-direction: column;

  .main-content {
    flex: 1;
    display: flex;
    padding: 10px;
    border-bottom: 1px solid #ccc;

    .portrait {
      width: 50px;
      height: 50px;
      border-radius: 50%;
      background-color: #000;
      margin-right: 10px;
    }

    .main-desc {
      >div:last-child {
        margin-top: 5px;
        font-size: 12px;
        color: #ccc;
      }
    }
  }
}

footer {
  // display: grid;
  // grid-template-columns: 1fr 1fr 1fr 1fr;
  border-top: 1px solid #ccc;
  position: fixed;
  bottom: 0;
  display: flex;
  justify-content: space-around;
  width: 100%;
  padding: 10px;
  background-color: #265dc2;

  .footer-content {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    padding: 5px;
  }
}
</style>

在这里插入图片描述

二、打包项目

安装Java环境

安装JDK Java Downloads | Oracle

安装安卓模拟器

Android Studio

  1. 新建空项目
    在这里插入图片描述
    在这里插入图片描述
  2. 加载完成后创建虚拟机,并运行
    在这里插入图片描述
  3. 运行项目
    在这里插入图片描述
    右键 Go To XML,切换为代码模式
    在这里插入图片描述
    修改为以下代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">
 
    <WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout  >

修改逻辑代码
在这里插入图片描述

package com.example.myapplication;
 
import androidx.appcompat.app.AppCompatActivity;
 
import android.os.Bundle;
 
import android.webkit.WebView;
 
import android.app.Activity;
 
import android.webkit.WebViewClient;
 
public class MainActivity extends Activity {
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //设置一个Activity的显示界面,
        setContentView(R.layout.activity_main);
 
        WebView view = (WebView)findViewById(R.id.web_view);
        //设置 WebView 属性,能够执行 Javascript 脚本
        view.getSettings().setJavaScriptEnabled(true);
        //加载需要显示的网页 不能使用局域网地址 只能虚拟机专属地址 http://10.0.2.2 端口是我们vue 项目端口
        view.loadUrl("http://10.0.2.2:3000");
 
        view.setWebViewClient(new WebViewClient());
    }
}
  1. 配置权限

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.myapplication">
 
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyApplication"
        android:usesCleartextTraffic="true"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
</manifest>
  1. 打包

打包的时候路径记得换成线上的服务器地址
在这里插入图片描述

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
作为一个 AI,我没有实际的开发经验。但是我可以告诉你一些关于 Vue 3 移动端开发项目的一般经验。 首先,Vue 3 是一个非常流行的 JavaScript 框架,用于构建用户界面。它具有响应式数据绑定、组件化开发和简洁直观的语法等特点,非常适合移动端开发。 在使用 Vue 3 开发移动端项目时,你可以选择使用 Vue CLI 创建项目,这样可以快速搭建基本的项目结构,并且集成了许多常用的工具和插件。 对于移动端开发,你可能需要使用 Vue Router 进行路由管理,这样可以实现页面之间的跳转和导航。另外,你还可以使用 Vuex 进行状态管理,这对于大型应用程序非常有用。 在移动端开发中,你还需要考虑适配不同的设备和屏幕大小。可以使用 CSS 媒体查询或者使用第三方库(如 Vant)来实现响应式布局和样式。 此外,移动端开发还需要考虑性能优化和用户体验。你可以使用 Vue 3 提供的优化技术,如异步组件、懒加载和代码分割等来提高应用程序的加载速度和性能。 最后,记得进行移动端的测试和调试。可以使用 Chrome 开发者工具的移动端模拟器进行测试,并利用 Vue 的调试工具进行调试。 总结起来,Vue 3 在移动端开发中具有很多优势,但你仍然需要根据项目的需求和特点做出合适的选择和调整。希望对你有所帮助!如果你有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡小多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值