.NET 程序员如何学习Vue

640?wx_fmt=png之所以取这个标题,是因为本文来自内部培训的整理,培训的对象是公司的 .NET 程序员,.NET 程序员学习 Vue 是为了在项目中做二次开发时能够更好地跟产品对接。

Vue 是现在比较流行的前端框架,也是非常容易入门的前端框架,花几个小时看看官方文档基本就入门,如果连官方文档都懒得看,那本文或许对您有所帮助。

开发一个站点最基本的知识点,我认为有以下几个:

  • 页面组装

  • 页面跳转

  • 页面传值

  • 接口调用

.NET 程序员通常会采用 Asp.Net 或 Asp.Net MVC 来开发网站,对于上面四点,在 .NET 中的对应关系如下:

知识点Asp.NetAsp.Net MVC
页面组装Aspx页面、用户控件、MasterPage视图、分部视图
页面跳转链接、Redirect路由
页面传值QueryString、Session等ViewBag、ViewData等
接口调用AjaxAjax

在 Vue 中、使用「组件」来组装页面,使用「路由」来做页面的跳转,传值分为「路由参数」和「组件之间的通讯」,接口的调用使用官方推荐的「axios」。

下面以一个简单的登录示例来讲解上面说到的一些知识点。

环境安装

首先安装 nodejs ,可以在http://nodejs.cn/download/找到相关的版本进行安装。

Vue的使用有两种模式,直接引用 Vue 的 js 文件,或者使用脚手架生成完整的项目框架,这里我们使用脚手架的方式,使用下面命令进行安装

npm install -g @vue/cli

创建应用

使用下面命令创建名为 hello-world 的应用

vue create hello-world

Vue 创建应用时分为默认模式和手动模式,这里我们选择默认模式

640?wx_fmt=png

创建完成后,项目的目录结构如下

640?wx_fmt=png

  • public:public中的静态资源会复制到最终打包的dist目录中

  • src:编写代码主要要操作的目录

  • src/assets:存放静态资源,如图片、字体等

  • src/components:组件目录

  • src/App.vue:根组件

  • src/main.js:入口文件

  • 下面的一些配置文件可以暂时不做深入研究

运行应用

在命令行输入npm run serve,运行起来后,在浏览器中输入http://localhost:8080,就可以访问站点了。

作为一个.NET程序员,本机通常安装有IIS,在IIS中可能有站点将8080端口占用了,这时就需要指定端口的方式来启动

.\node_modules\.bin\vue-cli-service serve –port 4000

一个简单的登录示例

安装 ElementUI

npm i element-ui -S

安装完成后在 main.js 中进行引用

import Element from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';Vue.use(Element, { size: 'small', zIndex: 3000 });

添加 login.vue 组件

在 components 目录中添加 login.vue 组件文件,代码如下:

<template><el-form ref="ruleForm" :model="formModel"><p class="title">登录</p><el-form-item required><el-input v-model="formModel.loginName" placeholder="请输入登录名" size="large"></el-input></el-form-item><el-form-item required><el-inputtype="password"v-model="formModel.password"@keyup.native="keyup"placeholder="请输入登录密码"size="large"></el-input></el-form-item><p v-show="showErrorMessage" class="alert">{{ errorMessage }}</p><el-form-item><el-button type="primary" size="medium" @click="login" >登录</el-button></el-form-item></el-form>
</template>
<script>
export default {name: "login",data() {return {errorMessage: "",formModel: {loginName: "",password: ""}};},watch: {"formModel.password": function(val) {if (val.trim() !== "") {this.errorMessage = "";} else {this.errorMessage = "请输入密码";}}},computed: {showErrorMessage() {return this.errorMessage !== "";}},mounted: function() {},methods: {keyup(event) {if (event.keyCode === 13) {this.login();}},login() {const loginName = this.formModel.loginName;const password = this.formModel.password;if (loginName === "") {this.errorMessage = "请输入登录名";return;}if (password === "") {this.errorMessage = "请输入密码";return;}//调用接口验证}}
};
</script>
<style scoped></style>
  • data():组件中使用到的数据需要以对象的方式在 data() 函数中返回

  • watch:监听属性,上面例子中监听 formModel.password 的值,当改变时,修改 errorMessage

  • computed:计算属性,例子中当 errorMessage 的值从空变成非空,或者从非空变成空时才会触发

  • mounted:页面加载完成后执行,如果登录组件想要请求接口设置一个背景图,可以写在这里

  • methods:常规的 js 方法就放在这里

安装路由

1、安装路由插件

npm install --save vue-router

2、在 main.js 中引入路由

import router from './routers/router'new Vue({router,render: h => h(App),
}).$mount('#app')

3、在 src 目录中添加 routers 目录,在该目录新增 router.js 文件,内容如下

import Vue from "vue";
import Router from "vue-router";
Vue.use(Router);
const router = new Router({mode: 'history',routes: [{path: "/login",name: "login",component: () =>import ("@/components/login.vue")},{path: "*",redirect: "/"}]
})
export default router;

添加了 /login 的路由地址,指向 login.vued的组件

4、修改 App.vue 组件

  <div id="app"><img alt="Vue logo" src="./assets/logo.png"><router-view></router-view></div>

添加了 router-view 后,路由中指定的组件就会被替换到此处。

5、此时访问 http://localhost:8080/login 可以看到下面界面

640?wx_fmt=png

添加 home.vue 组件

home 组件是登录成功后要跳转到的组件,该组件包含一个子组件 top-bar。

1、在 components 目录下添加 top-bar.vue 和 home.vue 文件

top-bar.vue

<template><div>这是网站的头部</div>
</template>
<script>
export default {name:"top-bar"
}
</script>
<style scoped></style>

home.vue

<template><el-container id="main-view"><el-header class="header"><top-bar></top-bar></el-header><el-main>这是正文部分</el-main></el-container>
</template><script>
import TopBar from "@/components/top-bar.vue";
export default {name: "home",components:{TopBar}
};
</script>
<style lang="css" scoped>
.header{background-color: rgb(0, 120, 215);color:aliceblue;padding-left:0;height:48px;
}
</style>

2、修改 login 组件的 login() 方法,添加登录路由跳转的逻辑

640?wx_fmt=png

3、修改 router.js ,添加登录后跳转的路由配置

640?wx_fmt=png

运行后,点击登录按钮就可以跳转到 home 组件了。

路由传参

登录成功后,将登录名传递到 home 组件中,通过路由传参的方式有很多种,这里使用 query 的方式

1、修改登录成功后的跳转

this.$router.push({path: "/",query: {code: loginName}
});

2、home 组件添加变量接收参数值

640?wx_fmt=png

组件通讯-父组件传递到子组件

父组件传递数据到子组件的方法是在子组件定义 props ,本例中将 home 组件接收到的登录名传递到 top-bar 组件中。

1、在 top-bar 组件中定义 props

640?wx_fmt=png

2、修改 home 组件进行传值

<top-bar :code="loginName"></top-bar>

组件通讯-子组件传递到父组件

子组件传递到父组件使用 $emit ,本例中在 top-bar 组件中添加一个按钮,点击按钮传递参数到 home 组件,并改变 home 组件的 loginName的值。

1、top-bar 组件中添加按钮和相关事件

640?wx_fmt=png

2、在 home 组件中进行事件接收

640?wx_fmt=png

接口调用

在 Vue 中使用 axios 需要先进行插件的安装

npm install axios --save

axios 的使用请点击「阅读原文」查看示例代码。

发布部署

发布

使用下面命令可以将项目发布到 dist 目录中

npm run build

发布结果如下

640?wx_fmt=png

部署到Docker

1、在 dist 目录中创建 Dockerfile文件,文件内容如下

FROM nginx:latest
COPY . /usr/share/nginx/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

2、进入到 dist目录,执行下面命令进行镜像的构建

docker build -t vue-demo .

3、创建 nginx 配置文件,在执行 docker run 时会将容器内的配置文件映射出来

server {listen       80;server_name  221.234.36.41;client_max_body_size 100M;location / { root   /usr/share/nginx/html;index  index.html index.htm;try_files $uri $uri/ /index.html;}error_page   500 502 503 504  /50x.html;location = /50x.html {root   /usr/share/nginx/html;}
}

3、执行 docker run 创建容器

docker run -d -p 9000:80 --name vue-demo -v ~/Documents/fengwei/projects/conf.d:/etc/nginx/conf.d:ro --restart=always vue-demo

在浏览器输入 http://localhost:9000 可以查看运行效果。

示例代码:https://github.com/oec2003/StudySamples/tree/master/VueSample/hello-world

希望本文对您有所帮助。

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3714 [BJOI2017]树的难题(点分治/线段树/单调队列)

P3714 [BJOI2017]树的难题 求解树上长度在L到R的树链中颜色段权值和最大的链。 首先求解树上链的问题,而且限制了链的长度,那么我们需要点分治处理,然后考虑每次分治,我们可以把链分成两类,先处理同色连通块&#xf…

A Simple Math Problem(2020 ICPC 江西省省赛)

A Simple Math Problem ∑i1n∑j1if(j)[gcd(i,j)1]∑i1n∑jinf(i)[gcd(i,j)1]∑i1n∑j1nf(i)[gcd(i,j)1]−∑i1n∑j1if(i)[gcd(i,j)1]f(1)∑d1nμ(d)nd∑i1ndf(id)−∑i1nf(i)ϕ(i)f(1)然后就可以O(nlog⁡n)求解了\sum_{i 1} ^{n} \sum_{j 1} ^{i} f(j)[gcd(i, j) 1]\\ \sum…

2019-03-10-算法-进化(存在重复)

给定一个整数数组,判断是否存在重复元素。 如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。 示例 1: 输入: [1,2,3,1] 输出: true示例 2: 输入: [1,2,3,4] 输出: false示例 3: 输入: [1,1,1,…

P3233 [HNOI2014]世界树(虚树/倍增/动态规划)

P3233 [HNOI2014]世界树 每次给出mi个点,查询每个点控制的点的个数,每个点由离他最近编号最小的点控制。 首先按照套路建出虚树,注意特判1节点,然后用栈维护右链,然后不断弹栈建边。 然后进行dp,求解出虚…

.Net之微信小程序获取用户UnionID

前言:在实际项目开发中我们经常会遇到账号统一的问题,如何在不同端或者是不同的登录方式下保证同一个会员或者用户账号唯一(便于用户信息的管理)。这段时间就有一个这样的需求,之前有个客户做了一个微信小程序商城&…

Absolute Math (HDU 6868)

Absolute Math 定义c(n)theprimenhave,c(1)0,c(2)1,c(4)1,c(6)2f(n)∑d∣nμ(d)22c(n)f(ab)f(a)f(b)f(gcd(a,b))∑i1mf(n)f(i)f(gcd(n,i))f(n)∑d∣n1f(d)∑i1mdf(id)[gcd(i,nd)1]f(n)∑d∣n1f(d)∑k∣ndμ(k)∑i1mkdf(ikd)Tkdf(n)∑T∣n∑i1mTf(iT)∑d∣Tμ(Td)f(d…

2019-03-10-算法-进化(只出现一次的数字)

题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1…

自由源自于自律 及其他三则分享

Office 365 官方公众号的新创深度内容推荐竹板这么一打呀,别的咱不夸,单说我们的Office 365官方公众号(“微软Office365”),近一段时间来在内容创作上面有一些新的突破——推出了一个关于探讨大脑及思维运作的专题。请…

CF871E Restore the Tree(构造/哈希)

CF871E Restore the Tree 对于一个n个点的树,给定k个点以及这k个点到n个点的距离,然后构造出一颗合法的树。如果不存在合法的树输出-1,任意输出一组解即可。 首先处理在关键点链上的节点,对于两个关键点,有且仅有他们…

Battlestation Operational HDU 6134

Battlestation Operational ∑i1n∑j1i⌈ij⌉[gcd(i,j)1]∑i1n∑j1i(ij1)[gcd(i,j)1]−∑i1n∑j1i[gcd(i,j)1,j∣i]∑i1n∑j1i(ij1)[gcd(i,j)1]−n∑i1n∑j1iij[gcd(i,j)1]∑i1n∑j1i[gcd(i,j)1]−n∑i1n∑j1iij[gcd(i,j)1]∑i1ϕ(i)−n∑i1n∑j1iij[gcd(i,j)1]∑d1nμ(d)∑i1n…

2019-03-11-算法-进化(求众数)

题目描述 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在众数。 示例 1: 输入: [3,2,3] 输出: 3示例 2: 输入: [2,2,1,1,1,2,2] 输出: 2思路&#xff1a…

淘宝商品数据库设计的一些经验

前言这几个月都在做一个通过淘宝API线下管理淘宝店的系统,学习了很多东西,这里想对淘宝商品表设计用自己的想法表现出来,如果你觉得很扯淡,可以写下自己的看法.OK,切入正题.淘宝的商品这块的复杂程度,是我见…

AT2645 [ARC076D] Exhausted?(Hall定理推论/线段树+扫描线)

AT2645 [ARC076D] Exhausted? 对于一个二分图左边点连接的是右边点的一个前缀和一个后缀,求解最大匹配。 首先不能直接求解最大匹配,但是我们可以利用Hall定理的推论求解 ∣U∣−max(∣X∣−N(∣X∣))|U|-max(|X|-N(|X|))∣U∣−max(∣X∣−N(∣X∣))…

2019-03-11-算法-进化(搜索二维矩阵II)

题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性: 每行的元素从左到右升序排列每列的元素从上到下升序排列 示例: 现有矩阵 matrix 如下: [[1, 4, 7, 11, 15],[2, 5, 8, 12, 19],[3, 6, 9…

A and B and Lecture Rooms

A and B and Lecture Rooms 题意要求我们找有多少个点iii满足dis(i,x),dis(i,y)dis(i, x), dis(i, y)dis(i,x),dis(i,y),输出点iii的数量即可。 首先特判无解的情况就是dis(x,y)dis(x, y)dis(x,y)为奇数时,接下来我们讨论有解的情况,大致分…

观星(计算几何/凸包/多边形面积)

观星 对于平面上有n个点分为三类&#xff0c;要求寻找一个三角形&#xff0c;三个顶点分别属于这三类&#xff0c;求解最大面积。 N<3000 首先考虑到O(n2)O(n^2)O(n2)的枚举&#xff0c;然后对于另外一种考虑这个点的位置&#xff0c;显然它应该在凸包上&#xff0c;因为我…

DevOps之持续集成SonarQube代码质量扫描

SonarQube是一个用于代码质量检测管理的开放平台&#xff0c;可以集成不同的检测工具&#xff0c;代码分析工具&#xff0c;以及持续集成工具。SonarQube 并不是简单地把不同的代码检查工具结果直接显示在 Web 页面上&#xff0c;而是通过不同的插件对这些结果进行再加工处理&a…

2019-03-12-算法-进化(合并两个有序数组)

题目描述 给定两个有序整数数组 nums1 和 nums2&#xff0c;将 nums2 合并到 nums1 中&#xff0c;使得 num1 成为一个有序数组。 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n你可以假设 nums1 有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存…

网络流与线性规划24题(写了一半,先鸽下了……)

Network-flows Ford-Fulkerson算法 typedef long long ll;const int N 1e5 10;int head[N], to[N], nex[N], flow[N], cnt;int vis[N], n, m, s, t;void add(int x, int y, int w) {to[cnt] y;nex[cnt] head[x];flow[cnt] w;head[x] cnt; }ll dfs(int rt, ll now) {if(…

数字(进制/二分/组合数学)

数字 求解满足从n1到2n中有恰好m个数字含有k个1的n&#xff0c;并求出个数 首先看到二进制的问题&#xff0c;我们需要寻找性质&#xff0c;首先考虑n1和2n的性质&#xff0c;然后这道题中我们设f(n,k)表示n1到2n中的数字含k个1的个数。 然后考虑f(n1,k)f(n,k)[2n1含k个1]&am…