目次
React チュートリアルのサンプルの完全な分析
始めましょう
ディレクトリ構造の説明
アプリ関数
サーバー側
var rawMarkup = marked(this.props.children.toString(), {sanitize: true});
ログイン後にコピー
" >
var rawMarkup = marked(this.props.children.toString(), {sanitize: true});
ログイン後にコピー
ホームページ ウェブフロントエンド htmlチュートリアル React シリーズ 1 の学習-React-チュートリアルの完全な分析_html/css_WEB-ITnose

React シリーズ 1 の学習-React-チュートリアルの完全な分析_html/css_WEB-ITnose

Jun 24, 2016 am 11:16 AM

React チュートリアルのサンプルの完全な分析

Talk is easy, Show me the code

最近 React に注目しています React の学習方法については、リンク先の記事を参照して独自の計画を立てることができます。 。千マイルも一歩から始まります。この記事は、React の公式チュートリアルからの例であり、詳細に学習することで、そこから多くのことを学び、進捗状況をみんなと共有するためにここにメモしました。

始めましょう

  1. サンプルをダウンロードして解凍します

  2. ノード環境により、ダウンロードして解凍した後は、それが配置されているディレクトリで実行するだけで済みます

    npm installnode server.js
    ログイン後にコピー
  3. デフォルトのポート設定は、ブラウザを開いて http://localhost:3000/ にアクセスしてください。

ディレクトリ構造の説明

react-tutorial

--node_modules    --body-parser:express中间件,用于接收和解析json数据    --express:express框架--public    --css        --base.css:基本样式文件    --scripts        -- example.js:React应用js文件    index.html:基本的HTML结构--.editorconfig:用于在不同的编辑器中统一编辑风格(文件编码)的配置文件--.gitignore:git相关配置文件--app.json:web app的相关信息--comments.json:上传的评论数据--LICENSE:项目代码使用协议--package.json:项目所依赖的包,npm install的安装包的配置文件--README.md:项目说明书,里面有使用说明--requirements.txt:不清楚--server.js:服务器端的js代码
ログイン後にコピー

アプリ関数

このプロジェクトは、図に示すような単純なアプリケーションを構築します

サーバー側

サーバー側の機能は比較的単純で、コードコメントの形式で分析されます

  1. 依存モジュールをインポートします

    var fs = require('fs');  //读写文件var path = require('path'); //路径var express = require('express'); //express框架var bodyParser = require('body-parser'); //中间件
    ログイン後にコピー

  2. アプリを生成して設定します

    //获取comments.json文件的路径var COMMENTS_FILE = path.join(__dirname, 'comments.json');//设置端口app.set('port', (process.env.PORT || 3000));//设置静态文件的文件目录路径app.use('/', express.static(path.join(__dirname, 'public')));//启用bodyParser中间件接收请求,并且接收并解析json数据app.use(bodyParser.json());app.use(bodyParser.urlencoded({extended: true}));
    ログイン後にコピー

  3. レスポンスヘッダー情報を設定する

    app.use(function(req, res, next) {    //允许跨域 CORS    res.setHeader('Access-Control-Allow-Origin', '*');    //缓存设置    res.setHeader('Cache-Control', 'no-cache');    next();});
    ログイン後にコピー

  4. 取得リクエストURLに対応した処理関数を設定(コメントJSONデータを取得)

    app.get('/api/comments', function(req, res) {    //读取comments.json文件,并且解析为json数据    fs.readFile(COMMENTS_FILE, function(err, data) {        if (err) {          console.error(err);          process.exit(1);        }        //读取成功后,返回        res.json(JSON.parse(data));    });});
    ログイン後にコピー

  5. 投稿リクエストURLに対応した処理関数を設定(コメントデータを送信)

    app.post('/api/comments', function(req, res) {    //先读取comments.json文件    fs.readFile(COMMENTS_FILE, function(err, data) {        if (err) {          console.error(err);          process.exit(1);        }        //将文件内容解析为json数据        var comments = JSON.parse(data);        //获取新评论        var newComment = {          id: Date.now(),          author: req.body.author,          text: req.body.text,        };        //添加json数组中        comments.push(newComment);        //将json数据写回到comments.json文件中,并且返回全部的评论数据         fs.writeFile(COMMENTS_FILE, JSON.stringify(comments, null, 4), function(err) {              if (err) {                console.error(err);                process.exit(1);              }              res.json(comments);        });    });});
    ログイン後にコピー

  6. スタート、ポートでリッスンしてください

    app.listen(app.get('port'), function() {  console.log('Server started: http://localhost:' + app.get('port') + '/');});
    ログイン後にコピー

Web 側

Web 側の中核は、example.js ファイルにあり、公式 Web サイトの情報と組み合わせて、このアプリケーションを分析し、単純な反応アプリケーションを構築する方法を学びます。

コンポーネント構造

React は Web コンポーネントの概念を実装しています。コンポーネント開発方法に従って、このアプリケーションのコンポーネント構造を分析してみましょう (図に示すように):

つまり:

-- CommentBox    -- CommentList        -- Comment    -- CommentForm
ログイン後にコピー

コンポーネント間DOM ノードの関係図、props からデータを読み取る

//评论人{this.props.author}//评论的内容{this.props.children}
ログイン後にコピー

コメントは MarkDown 構文をサポートしているため、ユーザーが入力したコンテンツを処理するには、マークされたサードパーティ ライブラリを使用する必要があります。

var rawMarkup = marked(this.props.children.toString(), {sanitize: true});
ログイン後にコピー

また、出力内容は HTML に解析する必要があり、デフォルトでは XSS 攻撃防止の考慮に基づき、React は出力内容を HTML に解析しません。この時点では、特殊な属性危険なセットインナーHTMLを使用する必要があります。コンテンツをオブジェクトの _html 属性に配置し、このオブジェクトを危険なほどセットインナーHTML属性に割り当てる必要があります。このとき、第 1 レベルのコンポーネント CommentBox によって渡されるデータが生成されます。データに基づいて複数のサブコンポーネント コメント
    var html = {_html:"输出的html内容"};<span dangerouslySetInnerHTML={html} />
    ログイン後にコピー
  1. サブコンポーネント コメントを生成するとき、各サブコンポーネントのキー属性を comment.id に設定します。これは、キーがオプションの一意の識別子であるためです。コンポーネントに一意のキーを設定し、そのキーがレンダリング サイクル全体にわたって一貫していることを保証することで、React がコンポーネントを再利用するか破棄して再作成するかをよりインテリジェントに決定できるようになり、レンダリング パフォーマンスが向上します。

    コンポーネント CommentForm
  2. コンポーネント CommentForm が行う必要があることは 2 つです

  3. 自身の状態 this.state (つまり、フォームに入力されたコメンテーターとコメントの内容) を管理する

フォーム入力が変更されたとき

フォームが送信されるとき

submit イベントがトリガーされると、上位層コンポーネント CommentBox のイベント処理関数が呼び出され、コンポーネント CommentBox の状態が変更されます。
  1. var Comment = React.createClass({    rawMarkup : function() {        var rawMarkup =  marked(this.props.children.toString(),{sanitize:true});        return {_html : rawMarkup}; //React的规则,会读取这个对象的_html内容,    },    render : function() {        return (            <div className="comment">                <h2 className="commentAuthor">                    {this.props.author}                </h2>                <span  dangerouslySetInnerHTML={this.rawMarkup()} />            </div>        );    }});
    ログイン後にコピー

    ここで注目に値する点があります。それは、抽象カスタム イベント commentSubmit と実際のイベント submit の間の接続です。これは非常に実用的なテクニックであり、それがどのように機能するかは次の章で説明します。
    1. コンポーネント CommentBox

      アプリケーション全体の最上位コンポーネントとして、CommentBox が行う必要があることは次のとおりです:
    2. サーバーから既存のコメント データをリクエストする
  2. 新しいコメント データをサーバーにアップロードする

管理 独自の状態、状態に応じてビューをレンダリングします (状態変化の図は次のとおりです)

var CommentList = React.createClass({    render : function() {        var commentNodes = this.props.data.map(function(comment){            return (                <Comment author={comment.author} key={comment.id}>                    {comment.text}                </Comment>            );        });        return (            <div className="commentList">                {commentNodes}            </div>        );    }})
ログイン後にコピー
最後に、コンポーネント CommentBox を実際の DOM ノードにマウントするだけで、効果がわかります
    りー
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、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ヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

&lt; Progress&gt;の目的は何ですか 要素? &lt; Progress&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:34 PM

この記事では、HTML&lt; Progress&gt;について説明します。要素、その目的、スタイリング、および&lt; meter&gt;との違い要素。主な焦点は、&lt; Progress&gt;を使用することです。タスクの完了と&lt; Meter&gt; statiの場合

&lt; datalist&gt;の目的は何ですか 要素? &lt; datalist&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:33 PM

この記事では、HTML&lt; Datalist&GT;について説明します。オートコンプリートの提案を提供し、ユーザーエクスペリエンスの改善、エラーの削減によりフォームを強化する要素。

HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? HTML5のクロスブラウザー互換性のベストプラクティスは何ですか? Mar 17, 2025 pm 12:20 PM

記事では、HTML5クロスブラウザーの互換性を確保するためのベストプラクティスについて説明し、機能検出、プログレッシブエンハンスメント、およびテスト方法に焦点を当てています。

&lt; meter&gt;の目的は何ですか 要素? &lt; meter&gt;の目的は何ですか 要素? Mar 21, 2025 pm 12:35 PM

この記事では、html&lt; meter&gt;について説明します。要素は、範囲内でスカラーまたは分数値を表示するために使用され、Web開発におけるその一般的なアプリケーション。それは差別化&lt; Meter&gt; &lt; Progress&gt;およびex

HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? HTML5フォーム検証属性を使用してユーザー入力を検証するにはどうすればよいですか? Mar 17, 2025 pm 12:27 PM

この記事では、ブラウザのユーザー入力を直接検証するために、必要、パターン、MIN、MAX、および長さの制限などのHTML5フォーム検証属性を使用して説明します。

ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? ビューポートメタタグとは何ですか?レスポンシブデザインにとってなぜそれが重要なのですか? Mar 20, 2025 pm 05:56 PM

この記事では、モバイルデバイスのレスポンシブWebデザインに不可欠なViewportメタタグについて説明します。適切な使用により、最適なコンテンツのスケーリングとユーザーの相互作用が保証され、誤用が設計とアクセシビリティの問題につながる可能性があることを説明しています。

&lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? &lt; iframe&gt;の目的は何ですか タグ?使用する際のセキュリティ上の考慮事項は何ですか? Mar 20, 2025 pm 06:05 PM

この記事では、&lt; iframe&gt;外部コンテンツをWebページ、その一般的な用途、セキュリティリスク、およびオブジェクトタグやAPIなどの代替案に埋め込む際のタグの目的。

Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Giteeページ静的なWebサイトの展開に失敗しました:単一のファイル404エラーをトラブルシューティングと解決する方法 Apr 04, 2025 pm 11:54 PM

GiteEpages静的Webサイトの展開が失敗しました:404エラーのトラブルシューティングと解像度Giteeを使用する

See all articles