Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.11.2018, 15:09
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

React, single page
сабж делается из несинглпейджа (сейчас на каждую страницу свой питоновский шаблон, index.jsx с рендерингом и т.д. - рендеринг только клиентский, серверный не нужен)

По замыслу хочется один шаблон, в нем роутер. Для каждой страницы есть свои скрипты, свой рендеринг, и это все должно подгружаться при необходимости.

т.е. открыли страницу - покрутился спиннер, все загрузилось и нарисовалось. Жмякнули ссылку перехода - покрутился спиннер рядом со ссылкой, догрузилось что надо, перерисовалось. Жмякнули одну ссылку а потом сразу другую (не дождавшись первую), должна нарисоваться страница по второй. Вот примерно такие кейсы, если упрощенно.

какие тут бестпрактисы, как это всё красиво обстряпать?
Ответить с цитированием
  #2 (permalink)  
Старый 12.11.2018, 15:09
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

по реакту большого опыта нет
Ответить с цитированием
  #3 (permalink)  
Старый 13.11.2018, 12:40
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

для React16.6 сделали lazy, читать тут - https://reactjs.org/blog/2018/10/23/react-v-16-6.html

раньше было так (есть другие аналоги): https://github.com/jamiebuilds/react-loadable

ну и обычный роутер https://github.com/ReactTraining/react-router

можно посмотреть React16.7 правда его еще в мастер не коммитили, там есть Hook'и, проще подключать мултипл-контекс,

про state management - надо сначала посмотреть context - https://reactjs.org/docs/context.html

делаешь классы в них хранишь данные, пишешь ф-ции, которые обрабатывают данные

если этого мало смотрим redux+saga, или mobx

итого: context + router + lazy
Ответить с цитированием
  #4 (permalink)  
Старый 13.11.2018, 18:59
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

спасибо, глянул.
lazy не совсем то - там предполагается, что при нажатии на ссылку старая верстка исчезает и показывается только то что в свойстве fallback, пока грузятся компоненты для новой страницы. А мне надо во время загрузки не затирать то что есть, просто показывать лоадер где-то сверху
Ответить с цитированием
  #5 (permalink)  
Старый 13.11.2018, 20:42
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

задача very complex, ) если не знать куда жать...

вот тебе мини прожект:

.babelrc
{
  "presets": [
    "env",
    "react",
    "es2015",
    "stage-0"
  ],
  "plugins": [
    "transform-class-properties"
  ]
}


package.json
{
  "name": "ttttest",
  "version": "1.0.0",
  "main": "index.js",
  "license": "MIT",
  "dependencies": {
    "babel-core": "^6.26.3",
    "babel-plugin-transform-class-properties": "^6.24.1",
    "babel-preset-env": "^1.7.0",
    "babel-preset-es2015": "^6.24.1",
    "babel-preset-react": "^6.24.1",
    "babel-preset-stage-0": "^6.24.1",
    "express": "^4.16.4",
    "parcel-bundler": "^1.10.3",
    "react": "^16.6.3",
    "react-dom": "^16.6.3",
    "react-router": "^4.3.1",
    "react-router-dom": "^4.3.1"
  }
}


server.js
const path = require('path')
const Bundler = require('parcel-bundler')
const bundler = new Bundler(path.join(__dirname, 'src', 'index.html'), {})
const express = require('express')
const app = express()
const server = require('http').Server(app)
// const io = require('socket.io')(server)

const server_messages = [
  { id: 1, title: 'message1' },
  { id: 2, title: 'message2' }
]

app.use(express.static(path.join(__dirname, 'public')))

app.get('/', function (req, res) {
  res.sendFile(path.join(__dirname, 'dist', 'index.html'))
})

app.get('/data', function (req, res) {
  setTimeout(() => res.json(server_messages), 5000)
})

// io.on('connection', function (socket) {
// })

app.use(bundler.middleware())

server.listen(2999, () => console.log('started at http://localhost:2999'))


src/index.html
<html>

<head></head>

<body>
  <div id="app"></div>
  <script type="text/javascript" src="index.js"></script>
</body>

</html>


src/index.js
import React from 'react'
import ReactDOM from 'react-dom'
import createBrowserHistory from "history/createBrowserHistory";
import { Router, Route, Link } from "react-router-dom"

const browserHistory = createBrowserHistory()

class Index extends React.Component {
  state = {
    loading: false
  }
  render() {
    return <React.Fragment>
      <h2>Home</h2>
      <button onClick={() => {
        this.setState({ loading: true })
        fetch('/data').then(r => r.json()).then(data => this.setState({ data, loading: false }))
      }}>getData</button>
      <button onClick={() => console.log('cancel')}>cancel request</button>
      {this.state.loading && <div>loading...</div>}
      {this.state.data && this.state.data.map(d => <div>{`${d.id} - ${d.title}`}</div>)}
    </React.Fragment>
  }
}
const About = () => <h2>About</h2>
const Users = () => <h2>Users</h2>

ReactDOM.render(
  <Router history={browserHistory}>
    <div>
      <nav>
        <ul>
          <li>
            <Link to="/">Home</Link>
          </li>
          <li>
            <Link to="/about/">About</Link>
          </li>
          <li>
            <Link to="/users/">Users</Link>
          </li>
        </ul>
      </nav>

      <Route path="/" exact component={Index} />
      <Route path="/about/" component={About} />
      <Route path="/users/" component={Users} />
    </div>
  </Router>,
  document.getElementById('app')
)


осталось сделать fetch cancelable:
https://developers.google.com/web/up...bortable-fetch
https://stackoverflow.com/questions/...-fetch-request

или использовать https://github.com/axios/axios
у него есть cancel

или забить на это и продумать поведение приложения заранее... )

Последний раз редактировалось SuperZen, 13.11.2018 в 23:45.
Ответить с цитированием
  #6 (permalink)  
Старый 18.11.2018, 13:13
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Alexandroppolus,
С поисковой оптимизацией все так же возникают проблемы.
На днях общался с очень уважаемым в SEO сфере человеком, он подтвердил.
Ответить с цитированием
  #7 (permalink)  
Старый 19.11.2018, 12:39
Аватар для SuperZen
Профессор
Отправить личное сообщение для SuperZen Посмотреть профиль Найти все сообщения от SuperZen
 
Регистрация: 08.11.2017
Сообщений: 642

в 17 версии обещают server side rendering из коробки )
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
React Router - re-render компонента при смене url smegol Библиотеки/Тулкиты/Фреймворки 9 29.09.2018 23:58
node.js + react не принимает пост запрос korih Node.JS 0 15.04.2018 17:52
Ищу Senior Frontend (React, Angular), Москва, 140 - 180 000 gross, full time офис. Ekaterina Polyakova Работа 0 11.08.2016 19:07
Нужен фронтенд разработчик со знанием React JS удаленно на проект sergeda Работа 0 13.11.2015 18:40
"Листание" текста в форме путем нажатия кнопки dikabraz Общие вопросы Javascript 20 25.08.2015 13:27