В предыдущей части этой серии руководств вы узнали, как реализовать функцию страницы профиля для приложения блога React. В этом уроке вы увидите, как реализовать теги для сообщений в блоге.
Начиная
Давайте начнем с клонирования исходного кода из последней части серии.
|
1
|
https://github.com/royagasthyan/ReactBlog-Profile
|
После того, как каталог был клонирован, перейдите в каталог проекта и установите необходимые зависимости.
|
1
2
|
cd ReactBlogApp-Profile
npm install
|
Запустите сервер Node.js, и приложение будет запущено по адресу http: // localhost: 7777 / index.html # / .
Создание страницы тегов
Давайте начнем с создания ссылки для пользователя, чтобы добавить тег в базу данных MongoDB. На странице index.html добавьте еще один li для страницы Add Tag .
|
1
|
<li role=»presentation» id=»tagHyperlink»><a href=»/home#/addTag»>Tag</a></li>
|
Когда пользователь щелкает ссылку « Add Tag , он должен отображать компонент AddTag React. Итак, давайте добавим маршрут для компонента Add Tag в файле home.jsx .
|
1
|
<Route component={AddTag} path=»/addTag»></Route>
|
Вот полный список маршрутов:
|
1
2
3
4
5
6
7
8
|
ReactDOM.render(
<Router history={hashHistory}>
<Route component={ShowPost} path=»/»></Route>
<Route component={AddPost} path=»/addPost(/:id)»></Route>
<Route component={ShowProfile} path=»/showProfile»></Route>
<Route component={AddTag} path=»/addTag»></Route>
</Router>,
document.getElementById(‘app’));
|
Давайте создадим компонент AddTag который будет отображаться, когда пользователь нажимает ссылку «Добавить тег».
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
class AddTag extends React.Component {
constructor(props) {
super(props);
}
componentDidMount(){
document.getElementById(‘addHyperLink’).className = «»;
document.getElementById(‘homeHyperlink’).className = «»;
document.getElementById(‘profileHyperlink’).className = «»;
document.getElementById(‘tagHyperlink’).className = «active»;
}
render() {
return (
<div className=»col-md-5″>
<div className=»form-area»>
<form role=»form»>
<br styles=»clear:both» />
<div className=»form-group»>
<input type=»text» className=»form-control» id=»tag» name=»tag» placeholder=»Tag» required />
</div>
<div className=»form-group»>
<button type=»button» id=»submit» name=»submit» className=»btn btn-primary pull-right»>Add Tag</button>
</div>
</form>
</div>
</div>
)
}
}
|
Как видно из приведенного выше кода, внутри класса компонента AddTag реагировать вы представили базовый HTML-шаблон для страницы. Внутри метода componentDidMount вас есть имя класса, чтобы сделать гиперссылку AddTag активной.
Сохраните вышеуказанные изменения и перезагрузите сервер. Войдите в приложение и нажмите на ссылку « Добавить тег» , и вы сможете просмотреть страницу « Add Tag .

Реализация функции добавления тега
Определите переменную состояния, чтобы отслеживать изменения тега.
|
1
2
3
4
5
6
|
constructor(props) {
super(props);
this.state = {
tag:»
};
}
|
Присоедините переменную состояния тега к элементу ввода в методе рендеринга.
|
1
|
<input value={this.state.tag} type=»text» onChange={this.handleTagChange} className=»form-control» id=»tag» name=»tag» placeholder=»Tag» required />
|
Как видно из приведенного выше кода, вы также прикрепили событие onChange к входу, чтобы отслеживать изменение его значения. onChange метод handleTagChange внутри конструктора.
|
1
2
3
4
5
6
7
|
constructor(props) {
super(props);
this.handleTagChange = this.handleTagChange.bind(this);
this.state = {
tag:»
};
}
|
Теперь давайте определим метод handleTagChange внутри компонента AddTag React.
|
1
2
3
|
handleTagChange(e){
this.setState({tag:e.target.value})
}
|
Когда пользователь нажимает кнопку «Добавить», чтобы добавить тег, вам необходимо сохранить данные. Итак, давайте прикрепим событие onClick к кнопке ввода.
|
1
|
<button type=»button» onClick={this.addTag} id=»submit» name=»submit» className=»btn btn-primary pull-right»>Add Tag</button>
|
addTag метод addTag внутри конструктора компонента React и определите метод, чтобы сделать вызов API для конечной точки сервера Node.js.
|
1
2
3
4
5
6
7
8
|
constructor(props) {
super(props);
this.addTag = this.addTag.bind(this);
this.handleTagChange = this.handleTagChange.bind(this);
this.state = {
tag:»
};
}
|
Далее давайте определим метод addTag для вызова API в конечной точке /addtag .
|
01
02
03
04
05
06
07
08
09
10
11
12
|
addTag(){
axios.post(‘/addtag’, {
tag: this.state.tag
})
.then(function (response) {
console.log(‘reponse from add tag is ‘,response);
})
.catch(function (error) {
console.log(error);
});
}
|
Давайте создадим конечную точку API Node.js для /addTag . Внутри файла app.js создайте маршрут /addTag , который проанализирует данные и вставит данные в базу данных MongoDB.
|
1
2
3
4
5
6
|
app.post(‘/addtag’, function (req, res) {
var tag = req.body.tag;
post.addTag(tag,function(result){
res.send(result);
});
})
|
Внутри /addTag точки /addTag вы сделали вызов метода addTag из файла post.js Давайте создадим метод addTag внутри файла post.js Вот как это выглядит:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
addTag: function(tagName, callback){
MongoClient.connect(url, function(err, db) {
db.collection(‘tag’).insertOne( {
«name»: tagName
},function(err, result){
assert.equal(err, null);
console.log(«Saved the tag details.»);
if(err == null){
callback(true)
}
else{
callback(false)
}
});
});
}
|
Как видно из приведенного выше кода, вы использовали MongoClient для подключения к базе данных MongoDB. Вы вставили данные тега в коллекцию с именем tag внутри базы данных. После того, как данные были вставлены без ошибок, логическое значение true передается в функцию обратного вызова. Если обнаружена ошибка, в функцию обратного вызова возвращается логическое ложное значение.
Сохраните вышеуказанные изменения и перезагрузите сервер. Войдите в приложение и нажмите на ссылку Добавить тег . Введите имя тега и нажмите кнопку Добавить . Проверьте консоль браузера, и вы должны увидеть сообщение об успехе, зарегистрированное в консоли браузера.
Заполнение тегов на странице добавления поста
После добавления тегов со страницы « Add Tag теги необходимо заполнить на странице « Add post . Давайте начнем с создания метода getTags внутри файла post.js который будет подключаться к базе данных MongoDB и извлекать теги. Вот как это выглядит:
|
1
2
3
4
5
6
7
8
9
|
getTag: function(callback){
MongoClient.connect(url, function(err, db){
db.collection(‘tag’, function (err, collection) {
collection.find().toArray(function (err, list) {
callback(list);
});
});
})
}
|
Как видно из приведенного выше кода, вы использовали MongoClient для подключения к базе данных MongoDB. После получения коллекции она преобразуется в массив с помощью метода toArray а затем передается в функцию обратного вызова.
Затем создайте конечную точку API Node.js, которая вызовет вышеуказанный метод app.js в app.js
|
1
2
3
4
5
|
app.post(‘/gettag’, function (req, res) {
post.getTag(function(result){
res.send(result);
});
})
|
В файле home.jsx внутри компонента AddPost создайте метод getTags который будет /gettag вызов API /gettag API и извлекать список тегов.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
getTags(){
var self = this;
axios.post(‘/getTag’, {
})
.then(function (response) {
if(response){
self.setState({tags:response.data});
}
})
.catch(function (error) {
console.log(‘error is ‘,error);
});
}
|
После того, как данные были получены из API, установите данные внутри переменной состояния tags .
В методе ShowPost компонента ShowPost React добавьте элемент HTML select, чтобы связать переменную состояния tags . Вот как это будет выглядеть:
|
01
02
03
04
05
06
07
08
09
10
11
|
<div className=»form-group»>
<label for=»sel1″>Select Tag:</label>
<select className=»form-control» >
{
this.state.tags.map(function(tag, i) {
return (<option key={i} value={tag._id}>{tag.name}</option>)
}.bind(this))
}
</select>
</div>
|
Как видно из приведенного выше кода, вы использовали метод map для сопоставления переменной состояния tags с элементом select.
Внутри метода componentDidMount getTags метод getTags для загрузки тегов после монтирования компонента.
|
1
2
3
4
5
6
7
8
|
componentDidMount(){
document.getElementById(‘addHyperLink’).className = «active»;
document.getElementById(‘homeHyperlink’).className = «»;
document.getElementById(‘profileHyperlink’).className = «»;
document.getElementById(‘tagHyperlink’).className = «»;
this.getPostWithId();
this.getTags();
}
|
Сохраните вышеуказанные изменения и перезагрузите сервер. После того, как вы загрузили страницу Add Post , вы должны загрузить теги в выбранный элемент HTML.

Давайте добавим опцию по умолчанию в раскрывающемся списке со значением 0.
|
01
02
03
04
05
06
07
08
09
10
11
|
<div className=»form-group»>
<select className=»form-control» value={this.state.tag} onChange={this.handleTagChange}>
<option value=»0″>Select Tag</option>
{
this.state.tags.map(function(tag, i) {
return (<option key={i} value={tag._id}>{tag.name}</option>)
}.bind(this))
}
</select>
</div>
|
Вы добавили событие onChange в выбранный элемент HTML. Вот как handleTagChange событие handleTagChange :
|
1
2
3
|
handleTagChange(e){
this.setState({tag:e.target.value})
}
|
Как только пользователь выберет тег, значение будет доступно в tag переменной состояния.
Включите переменную tag в метод AddPost компоненте AddPost React.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
addPost(){
axios.post(‘/addPost’, {
title: this.state.title,
subject: this.state.subject,
tag: this.state.tag,
id: this.props.params.id
})
.then(function (response) {
console.log(‘response from add post is ‘,response);
hashHistory.push(‘/’)
})
.catch(function (error) {
console.log(error);
});
}
|
Измените /addpost точку API /addpost чтобы включить параметр tag .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
app.post(‘/addpost’, function (req, res) {
var title = req.body.title;
var subject = req.body.subject;
var tag = req.body.tag;
var id = req.body.id;
console.log(‘id is ‘,id);
if(id == » || id == undefined){
console.log(‘add’);
post.addPost(title, subject ,tag,function(result){
res.send(result);
});
}
else{
console.log(‘update’,title,subject);
post.updatePost(id, title, subject ,tag,function(result){
res.send(result);
});
}
})
|
Измените метод post.js файле post.js чтобы включить параметр tag .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
addPost: function(title, subject,tag, callback){
MongoClient.connect(url, function(err, db) {
db.collection(‘post’).insertOne( {
«title»: title,
«subject»: subject,
«tag»: tag
},function(err, result){
assert.equal(err, null);
console.log(«Saved the blog post details.»);
if(err == null){
callback(true)
}
else{
callback(false)
}
});
});
}
|
Измените метод getPostWithId чтобы установить раскрывающийся getPostWithId при получении getPostWithId о getPostWithId .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
getPostWithId(){
var id = this.props.params.id;
var self = this;
axios.post(‘/getPostWithId’, {
id: id
})
.then(function (response) {
if(response){
self.setState({title:response.data.title});
self.setState({subject:response.data.subject});
self.setState({tag:response.data.tag})
}
})
.catch(function (error) {
console.log(‘error is ‘,error);
});
}
|
Сохраните вышеуказанные изменения и перезагрузите сервер. Войдите в систему и перейдите на страницу « Добавить сообщение» и добавьте сообщение с выбранным тегом. Вы будете иметь новую запись сохранена и в списке. Нажмите на кнопку «Редактировать», чтобы редактировать данные поста и тег.
Завершение
В этом уроке вы увидели, как реализовать страницу добавления тегов. Вы добавили поле тега на страницу добавления поста вместе с полями заголовка и темы.
Надеюсь, вам понравился этот урок. Дайте нам знать ваши мысли, предложения или любые исправления в комментариях ниже.
Исходный код из этого урока доступен на GitHub .