ReactIntl ​​работает только при обновлении браузера. - PullRequest
0 голосов
/ 09 ноября 2018

Перевод работает только на обновление. Кажется, потому что я использовал обертку вокруг App.js, поэтому он не работает.

Также я попытался добавить ключ в intlprovider, перевод работал, но теперь все мои внутренние компоненты обновляются.

Может ли быть способ использовать activintl при использовании оболочки приложения без обновления всех внутренних компонентов ??

Ниже вы можете найти app.js, index.js и оболочку приложения:

index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import './styles/global.css';
import registerServiceWorker from './registerServiceWorker';
import { createStore, applyMiddleware, compose  } from 'redux';
import thunk from 'redux-thunk';
import { Provider } from 'react-redux';

import rootReducer from './redux/rootReducers';
import AppWrapperContainer from './containers/appWrapperContainer/appWrapperContainer';
import {localeSet} from './redux/actions/localeActions';


const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
 const store = createStore(rootReducer, /* preloadedState, */ composeEnhancers(
    applyMiddleware(thunk)
  ));

if(localStorage.H24Lang)
{
 store.dispatch(localeSet(localStorage.H24Lang));
}

ReactDOM.render((

  <Provider store={store}>
    <AppWrapperContainer/>
  </Provider>

),

document.getElementById('root'));
registerServiceWorker();

AppWrapperContainer.js

import React, { Component } from 'react';
import { IntlProvider, addLocaleData} from "react-intl";
import PropTypes from 'prop-types';
import { connect } from 'react-redux';
import messages from '../../messages';
import en from "react-intl/locale-data/en";
import fr from "react-intl/locale-data/fr";
import App from "../../App";

addLocaleData(en);
addLocaleData(fr);



class AppWrapperContainer extends Component {

  constructor(props) {
    super(props);
    this.state = {

    };
}


  render() {
    const {lang} = this.props

    let locale = 
    (navigator.languages && navigator.languages[0])
    || navigator.language
    || navigator.userLanguage
    || lang

    return (
      // <IntlProvider locale={lang} messages={messages[lang]} key={lang}></IntlProvider>
      <IntlProvider locale={lang} messages={messages[lang]} >
        <App/>
      </IntlProvider>
    );
  }
}

AppWrapperContainer.propTypes = {
    lang: PropTypes.string.isRequired
}

//what reducer you need
function mapStateToProps(state) {
  console.log("State is", state);
    return {
      lang: state.locale.lang
    };
}

export default connect(mapStateToProps,null)(AppWrapperContainer);

App.js

import React, { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.min.css';
import Home from './screens/home/home';
import { connect } from 'react-redux';
import { BrowserRouter as Router, Route,Redirect, Switch } from 'react-router-dom';



class App extends Component {

  constructor(props) {
    super(props);
    this.state = {

    };
  }


  componentWillMount() {

  }

  componentDidMount() {

  }

  render() {
    return (
        <div className="App">
          <Router>
            <div className = "app-main-content">
              <Route exact path='/' component={Home} />
          </Router>

        </div>
    );
  }
}

//what reducer you need
function mapStateToProps(state) {
    return {

    };
}

function mapDispatchToProps(dispatch) {
    return {

    };
}

export default connect(mapStateToProps, mapDispatchToProps)(App);

1 Ответ

0 голосов
/ 09 ноября 2018

Опора key в IntlProvider заставляет React перемонтировать компонент (и все его дочерние элементы), но вы просто хотите, чтобы они были перерисованы (не перемонтированы).

Сначала убедитесь, что ваше сохраненное состояние меняет свое значение локали / языка как и ожидалось, и что это изменение переходит * mapStateToProps к вашему AppWrapperContainer компоненту. Затем убедитесь, что он получен в методе componentWillReceiveProps и что повторный рендеринг запускается при изменении его значения. Затем все дочерние элементы будут перерисованы (если не заблокированы методом shouldComponentUpdate).

Кстати, а что за locale переменная в AppWrapperContainer для?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...