Статьи

Создание блогового приложения с использованием React, часть 6: теги

В предыдущей части этой серии руководств вы узнали, как реализовать функцию страницы профиля для приложения блога 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 .

React Blog - Добавить тег просмотра

Определите переменную состояния, чтобы отслеживать изменения тега.

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.

React Blog App - Категория загружена на страницу добавления поста

Давайте добавим опцию по умолчанию в раскрывающемся списке со значением 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 .