2015-08-29 3 views
26

У меня есть функция, которая отображает текст письма:Как определить константы в ReactJS

sizeToLetterMap: function() { 
    return { 
       small_square: 's', 
       large_square: 'q', 
       thumbnail: 't', 
       small_240: 'm', 
       small_320: 'n', 
       medium_640: 'z', 
       medium_800: 'c', 
       large_1024: 'b', 
       large_1600: 'h', 
       large_2048: 'k', 
       original: 'o' 
      }; 
} 

эти буквы используются для создания FLICKR фото URLs. Таким образом, функция photoUrl принимает объект изображения и текстовый объект размера и вызывает sizeToLetterMap, чтобы придумать букву для текста такого размера.

Функция:

photoUrl(image, size_text): function() { 
     var size = this.sizeToLetterMap(size_text); 
} 

Я не думаю, что ее собственный дизайн, чтобы иметь sizeToLetterMap как функцию. Я думаю, что он лучше подходит как постоянный. Как определить константы в ReactJS?

+2

React - это просто библиотека для JavaScript. Реакция не распространяется на JavaScript.В частности, когда вы переходите к чему-то, что не связано с кодом пользовательского интерфейса, как о том, как объявлять константы, вы действительно не должны спрашивать, как React позволяет вам это сделать, а скорее, как делать это в JavaScript в целом. – icktoofay

+1

Возможный дубликат [Есть ли константы в JavaScript?] (Http://stackoverflow.com/questions/130396/are-there-constants-in-javascript) – icktoofay

+1

Я спрашиваю, как бы у вас был этот код в реакции? – Jasmine

ответ

6

ну, есть много способов сделать это в javascript, как и другие. Я не думаю, что есть способ сделать это в реакции. вот что я хотел бы сделать:

в JS файл:

module.exports = { 
    small_square: 's', 
    large_square: 'q' 
} 

в вашей реакции файла:

'use strict'; 

var Constant = require('constants'); 
.... 
var something = Constant.small_square; 

что-то для вас рассмотреть, надеюсь, что это помогает

22

Если вы хотите чтобы сохранить константы в компоненте React, используйте свойство statics, как показано ниже. В противном случае, используйте ответ, данный @Jim

var MyComponent = React.createClass({ 
    statics: { 
     sizeToLetterMap: { 
      small_square: 's', 
      large_square: 'q', 
      thumbnail: 't', 
      small_240: 'm', 
      small_320: 'n', 
      medium_640: 'z', 
      medium_800: 'c', 
      large_1024: 'b', 
      large_1600: 'h', 
      large_2048: 'k', 
      original: 'o' 
     }, 
     someOtherStatic: 100 
    }, 

    photoUrl: function (image, size_text) { 
     var size = MyComponent.sizeToLetterMap[size_text]; 
    } 
+0

Я считаю, что в этом случае вы можете получить доступ к свойствам 'static' _without_, чтобы создать экземпляр класса. , например. 'const staticFromClass = MyComponent.someOtherStatic // => 100' –

0

Вы также можете сделать,

getDefaultProps: -> 
    firstName: 'Rails' 
    lastName: 'React' 

Теперь доступ, те постоянной (значение по умолчанию) с помощью

@props.firstName 

@props.lastName 

Надежда эта помощь !! !.

2

Предупреждение: это экспериментальная функция, которая может кардинально изменить или даже прекратить свое существование в будущих версиях

Вы можете использовать ES7 статику:

npm install babel-preset-stage-0 

А затем добавить "stage-0" к .babelrc пресеты :

{ 
    "presets": ["es2015", "react", "stage-0"] 
} 

Затем вы идете

class Component extends React.Component { 
    static foo = 'bar'; 
    static baz = {a: 1, b: 2} 
} 

И затем использовать их как это:

Component.foo 
+1

Использование функций этапа 0 чрезвычайно рискованно, так как они могут резко измениться или даже не существовать в следующей версии языка. –

+0

Эй, это очень важный момент. Я добавлю это к своему ответу. Однако что может измениться в отношении таких простых конструкций, как статика? – emisilva

+0

Возьмите текущую реализацию статики: 'static get bar() {return _bar; } 'и' static set bar (значение) {_bar = value; } 'in es6 –

13

Вам не нужно использовать что-нибудь, но обычный React и ES6, чтобы достичь того, чего вы хотите. Согласно ответу Джима, просто определите константу в нужном месте. Мне нравится идея поддерживать постоянный локальный компонент, если он не нужен снаружи. Ниже приведен пример возможного использования.

import React from "react"; 

const sizeToLetterMap = { 
    small_square: 's', 
    large_square: 'q', 
    thumbnail: 't', 
    small_240: 'm', 
    small_320: 'n', 
    medium_640: 'z', 
    medium_800: 'c', 
    large_1024: 'b', 
    large_1600: 'h', 
    large_2048: 'k', 
    original: 'o' 
}; 

class PhotoComponent extends React.Component { 
    constructor(args) { 
    super(args); 
    } 

    photoUrl(image, size_text) { 
    return (<span> 
     Image: {image}, Size Letter: {sizeToLetterMap[size_text]} 
    </span>); 
    } 

    render() { 
    return (
     <div className="photo-wrapper"> 
     The url is: {this.photoUrl(this.props.image, this.props.size_text)} 
     </div> 
    ) 
    } 
} 

export default PhotoComponent; 

// Call this with <PhotoComponent image="abc.png" size_text="thumbnail" /> 
// Of course the component must first be imported where used, example: 
// import PhotoComponent from "./photo_component.jsx"; 
+0

Отлично. Я использовал это решение аналогичным образом для обновления компонента. 'конструктор (реквизит) { супер (реквизит); this.state = initialState } ' ' reset() { this.setState (начальное состояние) } ' –

Смежные вопросы