CodeIgniterアプリケーションは、その時点でReactJSを統合する計画がなく、はるか以前に開発されました。別のReactJSプロジェクトをこのバックエンドと統合し、現在のフロントエンド(ビュー)を置き換えるために、後の要件が追加されました。
CodeIgniterアプリケーションは、RESTful APIとして実行されません。サーバーがApacheであるため、.phpビューファイルをreactjsアプリの.jsファイルに置き換えることができませんでした。 nodejsサーバーを実行しても、CodeIgniterビューはレンダリングされません。
ブートストラップ、jquery、および単純なJavaScriptをCodeIgniterアプリケーションのビューに含めることができます。しかし、CodeIgniterのPHPビューファイルをjavascriptファイルに置き換えることは可能ですか?
PHPビューファイルをjsファイルに置き換える必要はありません。JavaScriptは、<script>
タグを使用してPHPファイルに簡単に追加できます。 Add React in One Minute CodeIgniterアプリのデモ。
ReactデモをCodeIgniterに統合するには、シンプルなコントローラーで開始します-React.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
class React extends CI_Controller
{
public function index()
{
$this->load->view('react_view');
}
}
「view」ファイルはReactデモから直接ですが、.htmlではなく.phpファイルに置かれます。
デモコードに加えられた唯一の変更は、ページの下部にあるスクリプトタグにあります。 assets
フォルダーは、CodeIgniterの/application
フォルダーと同じレベルにあります。 assets
には、css、js、および画像用のサブフォルダーがあります。
/public_html
/application
/system
/assets
/js
/css
/img
そこで、like_button.js
をロードするタグのsrc
を変更して、ファイルレイアウトを操作しました。
「ビュー」ファイルreact_view.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Add React in One Minute</title>
</head>
<body>
<h2>Add React in One Minute</h2>
<p>This page demonstrates using React with no build tooling.</p>
<p>React is loaded as a script tag.</p>
<p>
This is the first comment.
<!-- We will put our React component inside this div. -->
<div class="like_button_container" data-commentid="1"></div>
</p>
<p>
This is the second comment.
<!-- We will put our React component inside this div. -->
<div class="like_button_container" data-commentid="2"></div>
</p>
<p>
This is the third comment.
<!-- We will put our React component inside this div. -->
<div class="like_button_container" data-commentid="3"></div>
</p>
<!-- Load React. -->
<!-- Note: when deploying, replace "development.js" with "production.min.js". -->
<script src="https://unpkg.com/react@16/umd/react.development.js" crossorigin></script>
<script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js" crossorigin></script>
<!-- Load our React component. -->
<script src="assets/js/like_button.js"></script>
</body>
</html>
/assets/js/like_button.js
'use strict';
const e = React.createElement;
class LikeButton extends React.Component {
constructor(props) {
super(props);
this.state = { liked: false };
}
render() {
if (this.state.liked) {
return 'You liked comment number ' + this.props.commentID;
}
return e(
'button',
{ onClick: () => this.setState({ liked: true }) },
'Like'
);
}
}
// Find all DOM containers, and render Like buttons into them.
document.querySelectorAll('.like_button_container')
.forEach(domContainer => {
// Read the comment ID from a data-* attribute.
const commentID = parseInt(domContainer.dataset.commentid, 10);
ReactDOM.render(
e(LikeButton, { commentID: commentID }),
domContainer
);
});