웹 프론트엔드 View.js Vue.js 학습 3: 서버와의 데이터 상호작용

Vue.js 학습 3: 서버와의 데이터 상호작용

Oct 14, 2020 pm 05:21 PM
vue.js

Vue.js 튜토리얼오늘 칼럼에서는 Vue.js 학습의 세 번째 부분인 서버와의 데이터 상호작용을 소개합니다.

Vue.js 학습 3: 서버와의 데이터 상호작용

분명히 이전 02_toDoList에는 치명적인 결함이 있었습니다. 즉, 해당 데이터는 브라우저 측에만 존재합니다. 사용자가 페이지를 닫거나 다시 로드하면 이전에 프로그램에 추가한 모든 데이터가 손실되고 모든 것이 프로그램의 초기 상태로 돌아갑니다. 이 문제를 해결하기 위해서는 웹 애플리케이션의 프런트엔드가 백엔드 서버에서 얻은 입력 데이터를 적절한 시점에 저장하고, 필요할 때 서버에서 데이터를 검색해야 합니다. 노트의 이 부분은 Vue.js 프레임워크를 사용하여 웹 애플리케이션의 프런트엔드와 백엔드 간의 상호 작용을 완료하는 방법을 기록합니다. 이번에는 전체 학습 과정을 실행하는 "방명록" 애플리케이션도 구축하겠습니다. 02_toDoList存在着一个很致命的缺陷。那就是它的数据只存在于浏览器端,一但用户关闭或重新载入页面,他之前加入到程序中的数据就会全部丢失,一切又恢复到程序的初始状态。要想解决这个问题,就需要 Web 应用的前端在适当的时间将获得的输入数据存储到后端服务器上,然后在需要时再从服务器上获取这些数据。这部分笔记将记录如何利用 Vue.js 框架来完成 Web 应用程序的前端与后端之间的交互。这一次,我同样会通过构建一个"留言本"应用来贯穿整个学习过程。

首先需要在code目录下依次执行npm install express body-parser knexnpm install sqlite3@<指定的版本>命令,安装接下来创建 Web 服务所需要的后端组件(需要注意的是,这里安装的sqlite3要根据knex安装后的提示选择对应的版本)。接下来,在code目录下创建一个名为03_Message的目录,并在该目录下执行npm init -y命令,将其初始化成一个 Node.js 项目。在这里,之所以将服务端所需要的组件安装在项目目录的上一级目录中,是因为我接下来还需要在项目目录中安装前端组件,并将其开放给浏览器端访问,所以前后端所需要的组件最好分开存放。

现在,我要基于 Express 框架来创建一个 Web 服务了。具体做法就是在code/03_Message目录下创建一个名为index.js的服务器端脚本文件,并在其中输入如下代码:

const path = require('path');
const express = require('express')
const bodyParser = require('body-parser');
const knex = require('knex');
const port = 8080;

// 创建服务器实例
const app = express();

// 配置 public 目录,将其开放给浏览器端
app.use('/', express.static(path.join(__dirname, 'public')));
// 配置 node_modules 目录,将其开放给浏览器端
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules')));

//配置 body-parser 中间件,以便获取 POST 请求数据。
app.use(bodyParser.urlencoded({ extended : false}));
app.use(bodyParser.json());

// 创建数据库连接对象:
const appDB = knex({
    client: 'sqlite3', // 设置要连接的数据类型
    connection: {      // 设置数据库的链接参数
        filename: path.join(__dirname, 'data/database.sqlite')
    },
    debug: true,       // 设置是否开启 debug 模式,true 表示开启
    pool: {            // 设置数据库连接池的大小,默认为{min: 2, max: 10}
        min: 2,
        max: 7
    },
    useNullAsDefault: true
});

appDB.schema.hasTable('notes')  // 查看数据库中是否已经存在 notes 表
.then(function(exists) {
    if(exists == false) { // 如果 notes 表不存在就创建它
        appDB.schema.createTable('notes', function(table) {
            // 创建 notes 表:
            table.increments('uid').primary();// 将 uid 设置为自动增长的字段,并将其设为主键。
            table.string('userName');         // 将 userName 设置为字符串类型的字段。
            table.string('noteMessage');      // 将 notes 设置为字符串类型的字段。
    });
  }
})
.then(function() {
    // 请求路由
    // 设置网站首页
    app.get('/', function(req, res) {
        res.redirect('/index.htm');
    });

    // 响应前端获取数据的 GET 请求
    app.get('/data/get', function(req, res) {
        appDB('notes').select('*')
        .then(function(data) {
            console.log(data);
            res.status(200).send(data);
        }).catch(function() {
            res.status(404).send('找不到相关数据');
        });
    });

    // 响应前端删除数据的 POST 请求
    app.post('/data/delete', function(req, res) {
        appDB('notes').delete()
        .where('uid', '=', req.body['uid'])
        .catch(function() {
            res.status(404).send('删除数据失败');
        });
        res.send(200);
    });

    // 响应前端添加数据的 POST 请求
    app.post('/data/add', function(req, res) {
        console.log('post data');
        appDB('notes').insert(
            {
                userName : req.body['userName'],
                noteMessage : req.body['noteMessage']
            }
        ).catch(function() {
            res.status(404).send('添加数据失败');
        });
        res.send(200);
    });

    // 监听 8080 端口
    app.listen(port, function(){
        console.log(`访问 http://localhost:${port}/,按 Ctrl+C 终止服务!`);
    });
})
.catch(function() {
    // 断开数据库连接,并销毁 appDB 对象
    appDB.destroy();
});
로그인 후 복사

由于 Vue.js 框架的特点,前端需要后端提供的服务除了获取指定的 HTML 和 JavaScript 文件之外,主要就是对数据库的增删改查操作了,所以在上面这个服务中,除了将publicnode_modules目录整体开放给浏览器端访问之外,主要提供了一个基于 GET 请求的数据查询服务,和两个基于 POST 请求的数据添加与删除操作。

接下来,我可以开始前端部分的构建了。首先需要在code/03_Message目录下执行npm install vue axios命令,安装接下来所要用到的前端组件(该命令会自动生成一个node_modules目录,正如上面所说,该目录会被服务端脚本整体开放给浏览器端)。然后,继续在同一目录下创建public目录,并在其中创建一个名为index.htm的文件,其代码如下:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <script defer="defer" src="/node_modules/vue/dist/vue.js"></script>
    <script defer="defer" src="/node_modules/axios/dist/axios.js"></script>
    <script defer="defer" src="/js/main.js"></script>
    <title>留言本</title>
</head>
<body>
    <p id="app">
        <h1>留言本</h1>
        <p id="showNote" v-for="note in notes">
            <span>{{ note.userName }} 说:{{ note.noteMessage }} </span>
            <input type="button" value="删除" @click="remove(note.uid)">
        </p>
        <p id="addMessage">
            <h2>请留言:</h2>
            <label :for="userName">用户名:</label>
            <input type="text" v-model="userName">
            <br>
            <label :for="Message">写留言:</label>
            <input type="text" v-model="Message"></input>
            <input type="button" value="添加留言" @click="addNew">
        </p>
    </p>
</body>
</html>
로그인 후 복사

这个页面主要被分为了两个部分,第一部分会根据notes中的数据使用v-for指令迭代显示已被添加到数据库中的留言,并提供了一个删除按钮以便删除指定的留言(使用v-on指令绑定单击事件处理函数)。第二部分则是一个用于添加留言的输入界面,这里使用了v-model指令来获取需要用户输入的userNameMessage数据。现在,我需要来创建相应的 Vue 对象实例了,为此,我会在刚才创建的public目录下再创建一个js目录,并在其中创建名为main.js的自定义前端脚本文件,其代码如下:

// 程序名称: Message
// 实现目标:
//   1. 学习 axios 库的使用
//   2. 掌握如何与服务器进行数据交互

const app = new Vue({
    el: '#app',
    data:{
        userName: '',
        Message: '',
        notes: []
    },
    created: function() {
        that = this;
        axios.get('/data/get')
        .then(function(res) {
            that.notes = res.data;
        })
        .catch(function(err) {
            console.error(err);
        });
    },
    methods:{
        addNew: function() {
            if(this.userName !== '' && this.Message !== '') {
                that = this;
                axios.post('/data/add', {
                    userName: that.userName,
                    noteMessage: that.Message
                }).catch(function(err) {
                    console.error(err);
                });
                this.Message = '';
                this.userName = '';
                axios.get('/data/get')
                .then(function(res) {
                    that.notes = res.data;
                })
                .catch(function(err) {
                    console.error(err);
                });
            }
        },
        remove: function(id) {
            if(uid > 0) {
                that = this;
                axios.post('/data/delete', {
                    uid : id
                }).catch(function(err) {
                    console.error(err);
                });
                axios.get('/data/get')
                .then(function(res) {
                    that.notes = res.data;
                })
                .catch(function(err) {
                    console.error(err);
                });
            }
        }
    }
});
로그인 후 복사

这个 Vue 实例与我们之前创建的大同小异,主要由以下四个成员组成:

  • el成员:用于以 CSS 选择器的方式指定 Vue 实例所对应的元素容器,在这里,我指定的是<p id="app">元素。

  • data成员:用于设置页面中绑定的数据,这里设置了以下三个数据变量:

    • notes:这是一个数组变量,用于存放已被添加的留言记录。
    • userName:这是一个字符串变量,用于获取"用户名"数据。
    • Message:这是一个字符串变量,用于获取"留言"数据。
  • created成员:用于在程序载入时做初始化操作,在这里,我从服务端读取了已被添加的留言记录,并将其加载到notes变量中。

  • methods

    먼저 code 디렉터리에서 npm install express body-parser knexnpm install sqlite3@을 실행해야 합니다. . 웹 서비스를 생성하는 데 필요한 백엔드 구성 요소를 설치하는 명령(여기에 설치된 sqlite3knex뒤의 프롬프트에 따라 해당 버전을 선택해야 함) > 설치) . 다음으로 code 디렉터리에 03_Message라는 디렉터리를 생성하고 이 디렉터리에서 npm init -y 명령을 실행하여 복사합니다. Node.js 프로젝트. 여기서 서버에 필요한 컴포넌트를 프로젝트 디렉토리의 상위 디렉토리에 설치하는 이유는 프론트엔드 컴포넌트도 프로젝트 디렉토리에 설치하고 브라우저에서 열어서 접근해야 하기 때문입니다. 터미널에 필요한 구성 요소는 별도로 보관하는 것이 가장 좋습니다. 🎜🎜이제 Express 프레임워크를 기반으로 웹 서비스를 만들어 보겠습니다. 구체적인 방법은 code/03_Message 디렉토리에 index.js라는 서버 측 스크립트 파일을 생성하고 그 안에 다음 코드를 입력하는 것입니다: 🎜
    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://unpkg.com/axios/dist/axios.js"></script>
    <!-- 或者 -->
    <!-- 生产环境版本,优化了文件大小和载入速度 -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    로그인 후 복사
    로그인 후 복사
    🎜Due to Vue.js 프레임워크의 특성상 프런트엔드는 지정된 HTML 및 JavaScript 파일을 얻는 것 외에도 주로 데이터베이스를 추가, 삭제, 수정 및 쿼리하기 위해 백엔드에서 제공하는 서비스가 필요합니다. public 외에도 전체 node_modules 디렉터리가 브라우저 액세스에 공개되는 것 외에도 주로 GET 요청을 기반으로 한 데이터 쿼리 서비스와 두 가지 데이터 추가 및 POST 요청을 기반으로 한 삭제 작업. 🎜🎜다음으로 프런트 엔드 부분 구축을 시작할 수 있습니다. 먼저 code/03_Message 디렉터리에서 npm install vue axios 명령을 실행하여 다음에 사용할 프런트 엔드 구성 요소를 설치해야 합니다(이 명령은 자동으로 node_modules 디렉터리는 위에서 언급한 것처럼 서버 측 스크립트에 의해 브라우저에 전체적으로 열립니다. 그런 다음 계속해서 동일한 디렉터리에 <code>public 디렉터리를 만들고 그 안에 다음 코드를 사용하여 index.htm이라는 파일을 만듭니다. 🎜rrreee🎜이 페이지는 주로 두 부분으로 나누어 첫 번째 부분은 v-for 명령을 사용하여 notes의 데이터를 기반으로 데이터베이스에 추가된 설명을 반복적으로 표시하고, 지정된 메시지를 삭제하려면 삭제 버튼을 제공하세요(클릭 이벤트 핸들러 기능을 바인딩하려면 v-on 지시문을 사용하세요). 두 번째 부분은 메시지 추가를 위한 입력 인터페이스입니다. 여기서 v-model 명령은 userName메시지를 얻는 데 사용됩니다. 데이터. 이제 해당 Vue 객체 인스턴스를 생성해야 합니다. 이를 위해 방금 생성한 public 디렉터리 아래에 또 다른 js 디렉터리를 만들고 여기에 이름을 만듭니다. . main.js에 대한 사용자 정의 프런트 엔드 스크립트 파일입니다. 해당 코드는 다음과 같습니다. 🎜rrreee🎜이 Vue 인스턴스는 이전에 만든 인스턴스와 유사하며 주로 다음 4개의 멤버로 구성됩니다. : 🎜
    • 🎜el 멤버: CSS 선택기를 사용하여 Vue 인스턴스에 해당하는 요소 컨테이너를 지정하는 데 사용됩니다. 여기서는 <p id="app"을 지정합니다. > code> 요소입니다. 🎜
    • 🎜data 멤버: 페이지에 바인딩된 데이터를 설정하는 데 사용됩니다. 여기에는 다음 세 가지 데이터 변수가 설정됩니다. 🎜
      • notes: 추가된 메시지 레코드를 저장하는 데 사용되는 배열 변수입니다.
      • userName: "사용자 이름" 데이터를 얻는 데 사용되는 문자열 변수입니다.
      • 메시지: "메시지" 데이터를 얻는 데 사용되는 문자열 변수입니다.
    • 🎜created 멤버: 프로그램 로드 시 초기화에 사용됩니다. 여기서는 추가된 메시지 기록을 서버에서 읽어서 로드합니다. notes 변수에 넣으세요. 🎜
    • 🎜methods 멤버: 페이지에 바인딩된 이벤트 처리 함수를 정의하는 데 사용됩니다. 여기에는 다음 두 가지 이벤트 처리 함수가 정의됩니다.
      • addNew:用于添加新的留言记录,并同步更新notes中的数据。
      • remove:用于删除指定的留言记录,并同步更新notes中的数据。

    通常情况下,我们在 Vue.js 框架中会选择使用 axios 这样的第三方组件来处理发送请求和接收响应数据的工作,引入该组件的方式与引入 Vue.js 框架的方式是一样的,可以像上面一样先下载到本地,然后使用<script>标签引入,也可以使用 CDN 的方式直接使用<script>标签引入,像这样:

    <!-- 开发环境版本,包含了有帮助的命令行警告 -->
    <script src="https://unpkg.com/axios/dist/axios.js"></script>
    <!-- 或者 -->
    <!-- 生产环境版本,优化了文件大小和载入速度 -->
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    로그인 후 복사
    로그인 후 복사

    需要注意的是,该引用标签在 HTML 页面中的位置必须要在自定义 JavaScript 脚本文件(即main.js)的引用标签之前。当然,我在上述代码中只展示了axios.getaxios.post这两个最常用方法的基本用法,由于该组件支持返回 Promise 对象,所以我们可以采用then方法调用链来处理响应数据和异常状况。关于 axios 组件更多的使用方法,可以参考相关文档(http://www.axios-js.com/zh-cn/docs/)。

    更多相关免费学习:javascript(视频)

위 내용은 Vue.js 학습 3: 서버와의 데이터 상호작용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

vue에서 구성 요소화와 모듈화의 차이점은 무엇입니까 vue에서 구성 요소화와 모듈화의 차이점은 무엇입니까 Dec 15, 2022 pm 12:54 PM

구성요소화와 모듈화의 차이점: 모듈화는 코드 논리의 관점에서 구분되며, 코드 계층 개발을 용이하게 하고 각 기능 모듈의 기능이 일관되게 유지되도록 합니다. 컴포넌트화는 UI 인터페이스 관점에서 계획하는 것으로 프런트엔드의 컴포넌트화는 UI 컴포넌트의 재사용을 용이하게 합니다.

vite가 .env 파일을 구문 분석하는 방법에 대한 심층 토론 vite가 .env 파일을 구문 분석하는 방법에 대한 심층 토론 Jan 24, 2023 am 05:30 AM

Vue 프레임워크를 사용하여 프런트엔드 프로젝트를 개발할 때 배포 시 여러 환경을 배포하게 되는데, 개발 환경, 테스트 환경, 온라인 환경에서 호출되는 인터페이스 도메인 이름이 다른 경우가 많습니다. 어떻게 구별할 수 있나요? 그것은 환경 변수와 패턴을 사용하는 것입니다.

실용적인 전투: vue 파일을 지원하여 정의로 이동하는 플러그인을 vscode에서 개발합니다. 실용적인 전투: vue 파일을 지원하여 정의로 이동하는 플러그인을 vscode에서 개발합니다. Nov 16, 2022 pm 08:43 PM

vscode 자체는 Vue 파일 구성 요소를 지원하여 정의로 이동하지만 지원은 매우 약합니다. vue-cli 구성에 따라 다양한 유연한 사용법을 작성할 수 있어 생산 효율성을 향상시킬 수 있습니다. 그러나 vscode 자체에서 제공하는 기능이 파일 정의로 점프하는 것을 지원하지 못하게 하는 것은 이러한 유연한 쓰기 방법입니다. 이러한 유연한 작성 방법과 호환되고 작업 효율성을 높이기 위해 Vue 파일을 지원하는 vscode 플러그인을 작성하여 정의로 이동했습니다.

Vue 프로젝트에 Ace 코드 편집기를 통합하는 방법에 대한 자세한 그래픽 설명 Vue 프로젝트에 Ace 코드 편집기를 통합하는 방법에 대한 자세한 그래픽 설명 Apr 24, 2023 am 10:52 AM

Ace는 JavaScript로 작성된 내장형 코드 편집기입니다. Sublime, Vim 및 TextMate와 같은 기본 편집기의 기능 및 성능과 일치합니다. 모든 웹페이지와 JavaScript 애플리케이션에 쉽게 삽입할 수 있습니다. Ace는 Cloud9 IDE의 메인 편집자로 유지되며 Mozilla Skywriter(Bespin) 프로젝트의 후속 버전입니다.

Vue3에서 단위 테스트를 작성하는 방법 살펴보기 Vue3에서 단위 테스트를 작성하는 방법 살펴보기 Apr 25, 2023 pm 07:41 PM

Vue.js는 오늘날 프런트엔드 개발에서 매우 인기 있는 프레임워크가 되었습니다. Vue.js가 계속 발전함에 따라 단위 테스트는 점점 더 중요해지고 있습니다. 오늘은 Vue.js 3에서 단위 테스트를 작성하는 방법을 살펴보고 몇 가지 모범 사례와 일반적인 문제 및 솔루션을 제공하겠습니다.

vue3의 반응성()에 대해 자세히 이야기해 봅시다. vue3의 반응성()에 대해 자세히 이야기해 봅시다. Jan 06, 2023 pm 09:21 PM

서문: vue3 개발에서 반응형은 반응형 데이터를 구현하는 방법을 제공합니다. 일상적인 개발에서 자주 사용되는 API입니다. 이 기사에서 저자는 내부 작동 메커니즘을 탐구합니다.

Vue3 동적 구성 요소에서 예외를 처리하는 방법에 대한 간략한 분석 Vue3 동적 구성 요소에서 예외를 처리하는 방법에 대한 간략한 분석 Dec 02, 2022 pm 09:11 PM

Vue3 동적 구성 요소에서 예외를 처리하는 방법은 무엇입니까? 다음 기사에서는 Vue3 동적 구성 요소 예외 처리 방법에 대해 설명합니다. 이것이 모든 사람에게 도움이 되기를 바랍니다.

Vue2의 Composition API 구현 원리 분석 Vue2의 Composition API 구현 원리 분석 Jan 13, 2023 am 08:30 AM

Vue3 출시 이후, 단어 구성 API는 Vue를 작성하는 학생들의 시야에 들어왔습니다. 이제 @의 출시로 인해 구성 API가 이전 옵션 API보다 얼마나 나은지 항상 들어보셨을 것입니다. vue/composition-api 플러그인, Vue2 학생들도 버스에 탑승할 수 있습니다. 다음으로 우리는 주로 반응형 참조와 반응형을 사용하여 이 플러그인이 이를 어떻게 달성하는지에 대한 심층 분석을 수행할 것입니다.

See all articles