在 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 相关文章推荐
js中传递特殊字符(+,&amp;)的方法
Jan 16 Javascript
AngularJS入门教程之多视图切换用法示例
Nov 02 Javascript
Express的HTTP重定向到HTTPS的方法
Jun 06 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
Aug 11 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
Sep 20 Javascript
微信小程序实现的日期午别医生排班表功能示例
Jan 09 Javascript
jQuery分组选择器简单用法示例
Apr 04 jQuery
vue如何自动化打包测试环境和正式环境的dist/test文件
Jun 06 Javascript
详解微信小程序自定义组件的实现及数据交互
Jul 22 Javascript
Vue.extend 编程式插入组件的实现
Nov 18 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
Feb 08 Javascript
利用前端HTML+CSS+JS开发简单的TODOLIST功能(记事本)
Apr 13 Javascript
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
mysql From_unixtime及UNIX_TIMESTAMP及DATE_FORMAT日期函数
2010/03/21 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
PHP中strpos、strstr和stripos、stristr函数分析
2016/06/11 PHP
Zend Framework常用校验器详解
2016/12/09 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
Javascript 读后台cookie代码
2008/09/15 Javascript
两个比较有用的Javascript工具函数代码
2010/02/17 Javascript
javascript向后台传送相同属性的参数即数组参数
2014/02/17 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
javascript数组输出的两种方式
2015/01/13 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
JavaScript数组方法大全(推荐)
2016/07/05 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
Restify中接入Socket.io报Error:Can’t set headers的错误解决
2017/03/28 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
seajs和requirejs模块化简单案例分析
2019/08/26 Javascript
vuex根据不同的用户权限展示不同的路由列表功能
2019/09/20 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
[00:32]2018DOTA2亚洲邀请赛Secret出场
2018/04/03 DOTA
深入理解python try异常处理机制
2016/06/01 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
Python实现按逗号分隔列表的方法
2018/10/23 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
python 爬取古诗文存入mysql数据库的方法
2020/01/08 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
英文版网络工程师求职信
2013/10/28 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
销售工作决心书
2015/02/04 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js