Напишите виджет эпидемического запроса с помощью Vue3 (Vue-Composition API).

Vue.js

you.png

онлайн-адрес
git-адрес

Поскольку эпидемия слишком серьезная, я могу оставаться только дома, поэтому я использовал ее несколько дней назад.React+ AntdНаписал виджет эпидемического запроса:Реакт версия, и это можно рассматривать как небольшой вклад в профилактику и борьбу с эпидемией. За последние два дня я увидел, что версия Vue3-Alpha была выпущена до версии v3.0.0-alpha.4, как показано на рисунке:

QQ20200211-170124@2x.png
В этой версии основная работа заключается в обработке рендеринга на стороне сервера, поэтому Vu3 действительно не за горами. В то же время официальная надежда на то, что мы сможем активно опробовать новую версию Vue. В ответ на призыв (только потому, что дома так скучно), давайте попробуемVue3: Vue-Composition-Api + TypescriptДавайте реорганизуем наш виджет Epidemic Viewer.

Vue3 простые знания

Прежде чем мы начнем, давайте немного узнаем об этом.

setup

setup()Функции — это новые свойства, предоставляемые специально для компонентов в vue3. Он предоставляет нам унифицированную запись для использования новых функций Composition API vue3. Функция настройки будет вbeforeCreate 之后,created.setup()Функция принимает два параметра,setup(props,context). в:

  • props: получить реквизиты данных
    Определите имена параметров, которые текущий компонент позволяет внешнему миру передавать в свойствах:
      props: {
          propsName: String
      }
    
    Получить данные пропса через первый параметр функции настройки:
      setup(props) {
         console.log(props.p1)
      }
    
  • context: Этот объект контекста содержит некоторые полезные свойства. Доступ к этим свойствам должен осуществляться через this в vue 2.x. В vue 3.x доступ к ним осуществляется следующим образом:
      setup(props, context) {
          context.attrs
          context.slots
          context.parent
          context.root
          context.emit
          context.refs
      }
    

reactive()

reactive()Функция принимает простой объект и возвращает реактивный объект данных. Давайте посмотрим на его основное использование:

// js部分
import { reactive } from '@vue/composition-api'
setup() {
     // 创建响应式数据对象
    const state = reactive({count: 0})
     // setup 函数中将响应式数据对象 return 出去,供 template 使用
    return state // 必须return
}
// template里面使用
<p>当前的 count 值为:{{ state.count }}</p>

мы проходимreactiveОбернутый объект после возврата эквивалентен Vue 2.x.data()крючки. Мы можем выполнять с ним такие операции, как двусторонняя привязка.

ref

ref()Функция используется для создания реактивного объекта данных на основе заданного значения.Возвращаемое значение вызова функции ref() — это объект, который содержит только свойство .value:

  // js部分
   import { ref } from '@vue/composition-api'
   setup() {
       // 创建响应式数据对象 count,初始值为 0
       const count = ref(0)
       // 如果要访问 ref() 创建出来的响应式数据对象的值,必须通过 .value 属性才可以
       console.log(count.value) // 输出 0
       // 让 count 的值 +1
       count.value++
       // 再次打印 count 的值
       console.log(count.value) // 输出 1
       return {
           count,
           name: ref('zs')
       }
   }
  // template里面使用
   <template>
      <p>{{count}}-{{name}}</p>
   </template>

начать

Инициализировать проект

Сначала мы используемVue CliСкаффолдинг для инициализации нашего приложения:

800126DB-4748-457C-A498-0CCB24025457.png

Примечание. Использовать синтаксис компонента в стиле класса? Нам нужно выбрать нет для этого элемента, нам не нужен декоратор, мы используем API композиции

Создайте каталог проекта

Затем начните создавать каталог нашего проекта:

  ├── package-lock.json
  ├── package.json
  ├── public
  │   ├── favicon.ico
  │   └── index.html
  ├── src
  │   ├── App.vue
  │   ├── assets
  │   ├── components
  │   ├── main.ts
  │   ├── map
  │   ├── pages
  │   ├── plugins
  │   ├── services
  │   ├── shims-vue.d.ts
  │   └── utils
  ├── tsconfig.json
  ├── vue.config.js
  ├── yarn-error.log
  └── yarn.lock

каталог страницы:

  ├── home
  │   └── Home.vue
  ├── line
  │   └── TrendLine.vue
  ├── map
  │   └── Map.vue
  ├── news
  │   └── News.vue
  ├── pie
  │   └── Pie.vue
  └── rumor
      └── Rumor.vue

Импортировать Vue-Composition-Api

yarn add @vue/composition-api  //根目录执行
// main.ts
import VueCompositionApi from '@vue/composition-api'
Vue.use(VueCompositionApi)

Создать корневой компонент

Мы используем Home в качестве корневого компонента, давайте сначала определим этот компонент:

  import { createComponent, onMounted, onUnmounted, reactive } from '@vue/composition-api'
  export default createComponent({
  name: 'Home',
  components: {
  },
  setup() {
      // 生命周期部分
      onMounted(() => {
      console.log('onMounted...')
      console.log(state)
      })
      onUnmounted(() => {
      console.log('onUnmounted...')
      })
      return {
     
      }
  }
 })

пройти черезcreateComponent函数Разработка проекта осуществляется в сочетании с выводом типов, предоставляемым TypeScript.

Определить адаптивные данные

Затем мы должны определить некоторые данные ответа:

export interface HomeState {
  newsList?: []
  caseList?: []
}
// 在 setup()里面
    const origin: HomeState = {
    newsList: [],
    caseList: []
  }
  const state = reactive(origin)

асинхронный запрос

Затем нам нужно инициировать асинхронный запрос для инициализации данных.

setup(){
  // methods
  const getRumorList = async () => {
    ....
  }
  const getTrendList = async () => {
    ....
  }
  const initData = async () => {
    ....
  }
  // 在生命周期里面调用
  onMounted(() => {
      console.log('onMounted...')
      initData()
      getRumorList()
      getTrendList()
  })
}

Импорт и использование компонентов

Предположим, мы хотим импортироватьNewsКомпоненты:

import News from '@/pages/news/News.vue'
// components
components: {
  News
},
setup(){
  .....
}
// template 中使用
<News :newlist="state.newsList" />

Внутри компонента:

  import { createComponent } from '@vue/composition-api'
  export default createComponent({
  name: 'News',
  props: {
      newlist: Array
  }
  })

Развертывание докера

 # ncov-vue3 Dockerfile

  #指定node镜像对项目进行依赖安装和打包
  FROM node:10.16.0 AS builder
  # 将容器的工作目录设置为/app(当前目录,如果/app不存在,WORKDIR会创建/app文件夹)
  WORKDIR /app 
  COPY package.json /app/ 
  RUN npm config set registry "https://registry.npm.taobao.org/" \
      && npm install
  
  COPY . /app   
  RUN npm run build 

  #指定nginx配置项目,--from=builder 指的是从上一次 build 的结果中提取了编译结果(FROM node:alpine as builder),即是把刚刚打包生成的dist放进nginx中
  FROM nginx
  COPY --from=builder app/dist /usr/share/nginx/html/
  COPY --from=builder app/nginx.conf /etc/nginx/nginx.conf


  #暴露容器80端口
  EXPOSE 80

Смотрите здесь, маленькие друзья понимают в основном связанные операции и базовый ввод Vue3, мы также работаем с ним!

Скриншот эффекта

Давайте посмотрим на скриншот эффекта:


Наконец, давай, Ухань⛽️!