Ответы пользователя по тегу React
  • React. Как отследить render?

    devellopah
    @devellopah
    componentDidMount() is invoked immediately after a component is mounted. Initialization that requires DOM nodes should go here. If you need to load data from a remote endpoint, this is a good place to instantiate the network request. Setting state in this method will trigger a re-rendering.

    https://facebook.github.io/react/docs/react-compon...
    Ответ написан
    Комментировать
  • Как перебрать массив?

    devellopah
    @devellopah
    вроде как .createClass() уже или скоро deprecated
    привыкай к es6 классам
    Ответ написан
  • Как начать разрабатывать на React?

    devellopah
    @devellopah
    1) у них отличная документация с туториалом
    2) https://github.com/petehunt/react-howto
    Ответ написан
    Комментировать
  • Как подключить бд к react?

    devellopah
    @devellopah
    если будешь писать сервер на джаваскрипт, а в качестве базы данных sql ( -like ) , то стоит обратить внимание на docs.sequelizejs.com/en/v3

    погугли что-то вроде "expressjs sequelizejs tutorial"
    Ответ написан
    Комментировать
  • Как увязать React router и Redux-редьюсеры?

    devellopah
    @devellopah
    просто мысли вслух

    // types
    const types = {
    	UPDATE_FIELD: 'UPDATE_FIELD',
    };
    //types
    
    // operations
    const updateField = (value, error) => (
    	{ type: types.UPDATE_FIELD, value, error }
    );
    
    // reducer
    const initialState = { 
    	values: {email: '', password: ''}, 
    	errors: { email: '', password: '' } 
    };
    
    function someFormReducer(state = initialState, action) {
    	switch(action.type) {
    		case types.UPDATE_FIELD: {
    			return { 
    				values: { ...state.values, ...action.value }, 
    				errors: { ...state.errors, ...action.error };
    		}
    	}
    	
    	return state;
    }
    // reducer
    
    // так примерно выглядит global store
    {
    	...
    	...
    	form: {
    		login: {
    			values: {
    				email: '',
    				password: '',
    			},
    			errors: {
    				email: '',
    				password: ''
    			}
    		},
    	}
    }
    // так примерно выглядит global store
    
    
    import React from 'react';
    import { validateEmail, validatePassword } from 'someValidateLibrary';
    import { connect } from 'react-redux';
    import { browserHistory } from 'react-router';
    	
    import { updateField } from 'path to operations file (action creators)' 
    
    class SomeForm extends React.Component {
    	
    	handleValueChange = (e) => {
    		const field = e.target.name;
    		let error = '';
    		
    		if(field === 'email' && !validateEmail(field)) {
    			error = "You email is so bad, seriously!";
    		} 
    		else if (!validationPassword(field) ) {
    			error = "Your password is sucks!"
    		}
    		
    		this.props.dispatch(
    			updateField(
    				{ field: e.target.value.trim() }, 
    				{ field: error.trim() }
    			)
    		);
    	} 
    
    	proccessForm = () => {
    		const { errors } = this.props;
    		// если ошибок больше нет, то переход на другой роут
    		if(!errors.email && !errors.password) {
    			browserHistory.push('/home');
    		} else {
    			// your code here
    		}
    		
    	}
    	
    	render() {
    		const { values, errros } = this.props;
    		
    		return (
    			// some ui
    			<form onSubmit={this.proccessForm}>
    				<p class="form-field">
    					<input 
    						type="email" 
    						name="email" 
    						onChange={this.handleValueChange} 
    						value={values.email} 
    					/>
    					<span>{errors.email}</span>
    				</p>
    				<p class="form-field">
    					<input 
    						type="text" 
    						name="password" 
    						onChange={this.handleValueChange} 
    						value={values.password} 
    					/>
    					<span>{errors.password}</span>
    				</p>
    				<button 
    					type="submit" 
    					disabled={!values.email && !values.password}>
    						submit
    				</button>
    			</form>
    		);
    	}
    }
    
    const mapStateToProps = ({ form: { login } }) => (
      { values: login.values, errors: login.errors }
    );
    	
    
    connect(mapDispatchToProps)(SomeForm);
    Ответ написан
    4 комментария
  • Как вывести изображение в React + Redux (webpack)?

    devellopah
    @devellopah
    ты берёшь картинки из папки assets и потом после сборки туда же их и отправляешь. как-то это странно. возможно лучше создать папку/src/images, а в конфиге

    {
          test: /\.(jpg|jpeg|gif|png)$/,
           include: path.resolve(__dirname, "src/images"),
           loader:'url-loader?limit=1024&name=images/[name].[ext]'
       }


    и в стилях

    body {
        background: url(../../assets/back.jpg);
        background-size: cover;
        font-family: 'Open Sans', sans-serif;
    }
    Ответ написан
    Комментировать
  • Зачем верстальщику нужно изучать JavaScript?

    devellopah
    @devellopah
    1. обычно подразумевается, что вы владеете фреймворком ( angular, ember ) либо библиотекой типа react или vue ( плюс знакомы с их экосистемой ). Фреймворк предлагает все необходимые инструменты "out of the box" для построения веб-приложения ( в этом плане новичку может быть легче ).

    Библиотеки же сами из себя представляют инструмент для построения пользовательского интерфейса, а для построения полнофункционального приложения нужно будет обращаться к сторонним инструментам в рамкам экосистемы библиотеки ( но это не сложно ).

    2. Всё что угодно. Учитывая, что джаваскрипт ранится на сервере ( изоморфный джаваскрипт ) благодаря ноде. Вы можете стать фуллстек девелопером, зная всего один язык программирования.

    3. Для верстальщика джаваскрипт нужен в основном на уровне манипуляции с дом, подключения тех или иных ванильных или не совсем библиотек.

    4. думаю, минимум около полугода, чтобы стать джуниором.

    p.s. знание английского на уровне intermediate не помешает.
    Ответ написан
    Комментировать
  • О какой скорости идёт речь, если react этот тот же самый js?

    devellopah
    @devellopah
    реакт и другие решения - это слои абстракции поверх языка. это не одно и то же.
    Ответ написан
    4 комментария
  • Почему не работает bind?

    devellopah
    @devellopah
    Сохранять props компонента в его локальном state - антипаттерн.
    Ничего, если this.props.data определён как default props(не будет меняться), но в большинстве случаев будет(идёт из родительского state либо из глобального хранилища, то есть store).
    Когда this.props.data обновится, локальный state останется прежним. Придётся дергать componentWillRecieveProps.
    Данные, передаваемые как props почти всегда уже где-то храняться ( у родителя или в store ).
    Грубо говоря, за ними уже следят. Незачем их пересохранять в дркгом компоненте.

    Нельзя писать так handle = {this.test}. Пробелов быть не должно.

    Учитывая всё вышенаписанное, компонент можно переписать так

    export default class Board extends React.Component {
      test = () => {
        console.log(this)
      }
      
      render(){
        const temp = this.props.data.map((item, index) => 
          <Task data={item} key={index}  handle={this.test} />
        )
    
        return <div className="board">{temp}</div>
      }
    }
    Ответ написан
    Комментировать
  • Как выполнить action до рендеринга с сервера?

    devellopah
    @devellopah
    // Register server-side rendering middleware
    app.get('*', (req, res) => {
      if (__DEV__) {
        webpackIsomorphicTools.refresh();
      }
    
       const store = configureStore();
    
      // If __DISABLE_SSR__ = true, disable server side rendering
      if (__DISABLE_SSR__) {
        res.send(renderHtmlPage(store));
        return;
      }
    
      const memoryHistory = createMemoryHistory(req.url);
      const history = syncHistoryWithStore(memoryHistory, store, {
        selectLocationState: state => state.get('routing').toJS(),
      });
    
      // eslint-disable-next-line max-len
      match({history: memoryHistory, routes, location: req.url }, (error, redirectLocation, renderProps) => {
        if (error) {
          res.status(500).send(error.message);
        } else if (redirectLocation) {
          res.redirect(302, redirectLocation.pathname + redirectLocation.search);
        } else if (!renderProps) {
          res.sendStatus(404);
        } else {
          // Dispatch the initial action of each container first
          const promises = renderProps.components
            .filter(component => component.fetchData)
            .map(component => component.fetchData(store.dispatch, renderProps.params));
         
          // Then render the routes
          Promise.all(promises)
            .then(() => {
              // Using the enhanced history of react-redux-router to instead of the 'memoryHistory'
              const props = Object.assign({}, renderProps, { history });
              const content = renderToString(
                <Provider store={store}>
                   <RouterContext {...props} />
                </Provider>
              );
    
              res.status(200).send(renderHtmlPage(store, content));
            });
        }
      });
    });


    твой компонент который загружается при переходе на роут должен иметь статический метод fetchData, он может выглядеть примерно так

    class UsersPage extends React.Component {
    	
    	static async fetchData(url) {
    		try {
    			const res = await axios.get(url);
    			const users = res.data 
    		} catch(err) {
    			console.error(err.message);
    		}
    	}
    	
    	componentDidMount() {
    		this.fetchData(url);
    	}
    	
    	render() {
    		return (
    		 // whatever
    		);
    	}
    }
    Ответ написан
    Комментировать
  • Зачем нужна jwt стратегия?

    devellopah
    @devellopah
    Справка(упрощённо).
    Аутентификация - вход в систему.
    Авторизация - получение доступа к инфе из базы данных.

    Если ты создаёшь сессию для пользователей своего приложения, то когда юзер залогинился на сервере инициируется сессия и сервер в куках отправляет на клиент session id.
    В последующих запросах к базе данных сервер читает этот session id из кук, обращается к некой внутренней базе ( обычно имеет форму ключ-значение, где ключ - это session id, значение - mail пользователя, к примеру ) затем обращается к базе данных, достаёт данных для пользователя ( мы определили его на предыдущем шаге ) и возвращается в response.
    Такая система называется stateful ( поскольку мы вынуждены хранить инфу об аутентифицированных пользователях на сервере ). Это не вяжется с концепцией RESTful API, подразумевающей, что сервер должен быть stateless ( не хранить инфу аутентифицированных пользователях ).
    Добиться этого помогает json web token, поскольку он хранит всю необходимую для авторизации пользователя инфу. Это позволяет тебе написать RESTful API(stateless)

    Что почитать: session-based authentication, token-based authentication
    Ответ написан
    Комментировать
  • Есть ли смысл использовать Immutable вместе с React?

    devellopah
    @devellopah
    у преимущества библиотеки immutable над Object.assign ( or spread operator ) есть имя - structural data sharing.
    Опять-таки всё сводится к увеличению буста. Если у вас настолько сложный проект, что эффективности нативных вариантов недостаточно - подключайте immutable смело. В противном случае - нет необходимости.
    Ответ написан
    Комментировать
  • Для чего передавать параметр в функцию next из redux middleware?

    devellopah
    @devellopah
    функция next - это следующая в очереди миддвара, если таковой нет, то это - store.dispatch
    твоя миддвара принимает action, который эксплуатирует, а затем передаёт следующей миддваре.
    Чтобы передать дальше, твоя текущая миддвара возвращает вызов next c action в качестве аргумента, в противном случае action не дойдет до reducer(я так понимаю, возможно кто-то поправит).
    миддвары - это серия функций, которые по очереди работают с экшеном(обычно в миддварах делают сайд-эффекты, типа вывод в консоли экшена или запрос на получение каких-то данных).
    экшен задиспатчен -> серия миддлвар(работают с экшеном) -> экшен дошёл до редьюсера.

    примерно такая же схема как у миддлвар в express,

    приходит запрос(request) -> серия миддлвар(работают с request, формируют response) -> возвращается ответ(response)
    Если нет вызвать next() в миддваре express, приложение подвиснет(если не ошибаюсь).
    Ответ написан
  • Почему не работает redux-logger в изоморфном приложении?

    devellopah
    @devellopah
    лучше как-то так, чтобы не повторяться

    import { compose, createStore, combineReducers, applyMiddleware } from 'redux';
    import createLogger from 'redux-logger';
    import * as reducers from './reducers';
    import promises from './middlewares/promises';
    
    
    const reducer = combineReducers(reducers);
    const middlewares = [promises];
    
    if(process.env.NODE_ENV === 'development') {
      
      if(process.browser) {
        middlewares.push(createLogger());
      }
      
      // другие миддлвары, которые использовать только в этой среде
    }
    
    const store = compose(applyMiddleware(...middlewares))(createStore)(reducer);
    
    export default store;
    Ответ написан
    Комментировать
  • Как исключить React модули из eslint?

    devellopah
    @devellopah
    создаёшь файл .eslintignore и прописываешь пути до папок, в которых находится код, который не хочешь линтить
    Ответ написан
    Комментировать
  • Как реализовать смену цвета в React?

    devellopah
    @devellopah
    можно так попробовать codepen.io/dagman/pen/KWbXRg

    class App extends React.Component {
    	
    	toggle() {
    		this.page.classList.toggle('dark');
    	}
    	
    	render() {
    		return (
    			<div 
    				className="page" 
    				ref={page => this.page = page}
    			>
    				<button 
    					className=" center toggler"
    					onClick={this.toggle.bind(this)}
    				>
    					Toggle
    				</button>
    			</div>
    		);
    	}
    }
    
    ReactDOM.render(
    	<App />,
    	document.getElementById('root')
    );
    Ответ написан
    Комментировать
  • Как правильно в es6 компоненте задать initial state?

    devellopah
    @devellopah
    если нет методов, которые нужно привязать в конструкторе, то можно и так

    class MyComponent extends React.Component {
    
      static propTypes = {}
    
      static defaultProps = {}
    
      state = { number: 0 }
    
      componentDidMount() {}
    
      method1() {}
    
      // et cetera
    }
    Ответ написан
    Комментировать
  • Что делать с общими методами компонентов React?

    devellopah
    @devellopah
    выводи общий state в родительский компонент
    Ответ написан
    Комментировать
  • Webpack не показывает страницу с динамическим ID?

    devellopah
    @devellopah
    ты же делаешь запрос на сервер, которого у тебя нет, поэтому и ошибка.
    нужно набросать простенький express сервер с wildcard роутом в entry point файле, примерно так

    // ./index.js
    const express = require('express')
    const path = require('path')
    const port = process.env.PORT || 3000
    const app = express()
    
    // serve static assets normally
    app.use(express.static(__dirname + '/public'))
    
    // Handles all routes so you do not get a not found error
    app.get('*', function (request, response){
        response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
    })
    
    app.listen(port)
    console.log("server started on port " + port)


    где бы ты не делал перезагрузку страницы тебя будет выкидывать на главную.

    p.s. почитай про server-side rendering with react
    Ответ написан
    Комментировать
  • Видео уроки. По чем учиться?

    devellopah
    @devellopah
    1. бесплатные уроки
    a) устанавливаешь расширение Ratings Preview for Youtube
    б) в youtube пишешь что-то типа react tuts, react tutotial и т.д.
    в) смотришь на рейтинг видео(если люди заценили значит смотрибельно)

    2. платные уроки
    laracasts.com,
    pluralsight.com,
    lynda.com,
    codeschool.com,
    tutsplus.com
    udacity.com
    udemy.com

    (многие видеокурсы от этих поставщиков есть на торрентах)
    Ответ написан
    Комментировать