在 Vue 应用中使用 Netlify 表单功能的方法详解


Posted in Javascript onJune 03, 2019

Netlify 带有内置表单处理功能,可以用来存储表单数据,下载 csv 文件,同时可以在接收到新的提交时发送邮件通知或者通过配置 webhook 发送请求。

它是通过在部署应用时直接解析 HTML 文件,识别 html 中的 form 标签来实现的,本文记录如何在一个 Vue 应用中使用表单功能。

开发

首先使用@vue/cli 新建一个 Vue 应用,完成一系列步骤后,运行应用

vue create my-awesome-app
...
yarn serve

创建一个 form 表单

<!--
 data-netlify="true" 表明使用 form 功能
 netlify-honeypot="bot-field" 指定机器人识别字段
 -->
<template>
 <form
 id="app"
 method="POST"
 name="contact"
 data-netlify="true"
 netlify-honeypot="bot-field"
 @submit.prevent="handleSubmit"
 >
 <input name="bot-field" hidden>
 <label for="username">
  用户名:
  <input
  type="text"
  id="username"
  placeholder="请输入你的用户名"
  name="username"
  v-model="form.username"
  >
 </label>
 <label for="email">
  邮箱:
  <input type="email" id="email" placeholder="请输入你的邮箱" name="email" v-model="form.email">
 </label>
 <button type="submit">Submit</button>
 </form>
</template>

注意应用的根节点一定要保留 id=''app" 属性,否则经过静态化之后页面上绑定的事件会失效

在 form 标签上监听 submit 事件,并且阻止浏览器默认事件,使用 axios 提交 post 请求

yarn add axios

handleSubmit() {
 axios
 .post(
  "/",
  this.encode({
  "form-name": "contact", // 请求数据一定要加上 form-name 属性
  ...this.form
  }),
  {
  header: { "Content-Type": "application/x-www-form-urlencoded" }
  }
 )
 .then(() => {
  alert("提交成功");
 })
 .catch(() => {
  alert("提交失败");
 });
}

安装预渲染插件 prerender-spa-plugin github.com/chrisvfritz… ,作用是静态化 Vue 应用,一定要预渲染 Vue 应用,因为如果是通过 js 渲染的页面, Netlify 是解析不到 form 表单的

yarn add prerender-spa-plugin --dev

新建一个 vue.config.js 文件用来扩展  webpack 配置

const path = require('path')
const PrerenderSPAPlugin = require('prerender-spa-plugin')

module.exports = {
 configureWebpack: () => {
 if (process.env.NODE_ENV !== 'production') return
 return {
  plugins: [
  new PrerenderSPAPlugin({
   staticDir: path.join(__dirname, 'dist'),
   routes: ['/']
  })
  ]
 }
 }
}

完整代码如下

<template>
 <!--
 data-netlify="true" 表明使用 form 功能
 netlify-honeypot="bot-field" 指定机器人识别字段
 -->
 <form
 id="app"
 method="POST"
 name="contact"
 data-netlify="true"
 netlify-honeypot="bot-field"
 @submit.prevent="handleSubmit"
 >
 <input name="bot-field" hidden>
 <label for="username">
  用户名:
  <input
  type="text"
  id="username"
  placeholder="请输入你的用户名"
  name="username"
  v-model="form.username"
  >
 </label>
 <label for="email">
  邮箱:
  <input type="email" id="email" placeholder="请输入你的邮箱" name="email" v-model="form.email">
 </label>
 <button type="submit">Submit</button>
 </form>
</template>

<script>
import axios from "axios";

export default {
 name: "app",
 data() {
 return {
  form: {
  username: "",
  email: ""
  }
 };
 },
 methods: {
 encode(data) {
  return Object.keys(data)
  .map(
   key => `${encodeURIComponent(key)}=${encodeURIComponent(data[key])}`
  )
  .join("&");
 },
 handleSubmit() {
  axios
  .post(
   "/",
   this.encode({
   "form-name": "contact",
   ...this.form
   }),
   {
   header: { "Content-Type": "application/x-www-form-urlencoded" }
   }
  )
  .then(() => {
   alert("提交成功");
  })
  .catch(() => {
   alert("提交失败");
  });
 }
 }
};
</script>

<style>
#app {
 font-family: "Avenir", Helvetica, Arial, sans-serif;
 -webkit-font-smoothing: antialiased;
 -moz-osx-font-smoothing: grayscale;
 text-align: center;
 color: #2c3e50;
 margin-top: 60px;
}
label {
 display: block;
}
</style>

部署

在 Github 上新建一个仓库,上传代码,之后在 Netlify 上点击 New site form Git,进行授权,完成授权后选择要部署的项目仓库

在 Vue 应用中使用 Netlify 表单功能的方法详解 

 填写构建命令,点击 Deploy site 按钮

在 Vue 应用中使用 Netlify 表单功能的方法详解 

 经过一段时间的等待,不出意外应用就部署成功了地址 

在 Vue 应用中使用 Netlify 表单功能的方法详解 

注意在提交数据中一定要有 form-name 属性,否则 Netlify 会接收不到数据,返回 404 错误

在 Vue 应用中使用 Netlify 表单功能的方法详解 

 输入测试数据,点击提交就可以在 Netlify 的站点操作面板看到数据了

 在 Vue 应用中使用 Netlify 表单功能的方法详解

总结

以上所述是小编给大家介绍的在 Vue 应用中使用 Netlify 表单功能的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Extjs表单常见验证小结
Mar 07 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
Apr 04 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
基于jQuery实现搜索关键字自动匹配功能
Mar 26 Javascript
12个超实用的JQuery代码片段
Nov 02 Javascript
jQuery仿京东商城楼梯式导航定位菜单
Jul 25 Javascript
jQuery实现自动输入email、时间和域名的方法
Aug 24 Javascript
Node.js环境下Koa2添加travis ci持续集成工具的方法
Jun 19 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
vue实现按需加载组件及异步组件功能
May 27 Javascript
layui添加动态菜单与选项卡
Jul 26 Javascript
vue中this.$http.post()跨域和请求参数丢失的解决
Apr 08 Vue.js
JavaScript之数组扁平化详解
Jun 03 #Javascript
JavaScript从原型到原型链深入理解
Jun 03 #Javascript
生产制造追溯系统之再说条码打印
Jun 03 #Javascript
VUE安装使用教程详解
Jun 03 #Javascript
教你完全理解ReentrantLock重入锁
Jun 03 #Javascript
生产制造追溯系统之在线打印功能
Jun 03 #Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 #Javascript
You might like
php利用smtp类实现电子邮件发送
2015/10/30 PHP
简单的php+mysql聊天室实现方法(附源码)
2016/01/05 PHP
关于Jqzoom的使用心得 jquery放大镜效果插件
2010/04/12 Javascript
监控 url fragment变化的js代码
2010/04/19 Javascript
让jQuery与其他JavaScript库并存避免冲突的方法
2013/12/23 Javascript
PHP配置文件php.ini中打开错误报告的设置方法
2015/01/09 PHP
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
2016/04/07 Javascript
javascript 数组的定义和数组的长度
2016/06/07 Javascript
JS数组去掉重复数据只保留一条的实现代码
2016/08/11 Javascript
Nodejs下用submit提交表单提示cannot post错误的解决方法
2016/11/21 NodeJs
浅谈struts1 &amp; jquery form 文件异步上传
2017/05/25 jQuery
使用重写url机制实现验证码换一张功能
2017/08/01 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
JavaScript中严格判断NaN的方法
2018/02/16 Javascript
Vue2.0实现调用摄像头进行拍照功能 exif.js实现图片上传功能
2018/04/28 Javascript
JS中call和apply函数用法实例分析
2018/06/20 Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
2019/02/13 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛 5 24 iG VS DK
2014/05/26 DOTA
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
Python urllib模块urlopen()与urlretrieve()详解
2013/11/01 Python
win7 x64系统中安装Scrapy的方法
2018/11/18 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
css3动画 小球滚动 js控制动画暂停
2019/11/29 HTML / CSS
delegate与普通函数的区别
2014/01/22 面试题
销售业务实习自我鉴定
2013/09/23 职场文书
物业管理应届生求职信
2013/10/28 职场文书
装修设计师求职信
2014/02/26 职场文书
海飞丝广告词
2014/03/20 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
小学主题班会教案
2015/08/17 职场文书
施工安全协议书
2016/03/22 职场文书
Python利器openpyxl之操作excel表格
2021/04/17 Python
Vue项目打包、合并及压缩优化网页响应速度
2021/07/07 Vue.js