Это общий случай, когда реквизиты компонента меняются, и поэтому повторный рендеринг компонента происходит с новыми реквизитами.
Но, как кажется, вы не берете value
блока input
из реквизита, только атрибуты блока input
будут изменены в соответствии с новыми реквизитами, переданными в CenterFormInput
] Попробуйте передать value
поля также в подпорках (может быть пустым или пустым по умолчанию)
const CenterFormInput = ({
formElement: { inputType, value = null, elementName, help, label },
helpTextSetter
}) => {
return (
<div>
<p>{label}</p>
<p>
<input name={elementName} value={value} type="text" />
</p>
</div>
);
};
и обновить значение события onChange
поля ввода. Это сбросит значение поля input
при повторном рендеринге или установит значение, переданное.
Или вы можете также сделать компонент Statefull и поддерживать значение в состоянии и сбросить его на componentWillRecieveProps
или getDerivedStateFromProps
в зависимости от используемой вами версии реакции.
Не стесняйтесь добавлять комментарии в случае более подробной информации.
Необходимо будет обеспечить снова переплетать членский шаблон и другой материал, который перечислен в требованиях к распределителям в Стандарте C++. Например, Вам нужен шаблонный конструктор копии, который принимает не только allocator<T>
но также и allocator<U>
. Например, один код мог бы сделать, который станд.:: список, например, вероятно, сделает
template<typename Allocator>
void alloc1chunk(Allocator const& alloc) {
typename Allocator::template rebind<
wrapper<typename Allocator::value_type>
>::other ot(alloc);
// ...
}
Код перестанет работать, если там или существовать не корректные будут снова переплетать шаблон или там не будут существовать никакой соответствующий конструктор копии. Вы нигде не не станете полезными с предположением, каковы требования. Рано или поздно Вы будете иметь отношение к коду, который полагается на одну часть тех требований к распределителям, и код перестанет работать, потому что Ваше средство выделения нарушает их. Я рекомендую смотреть на них в некотором рабочем проекте Вашей копии Стандарта в 20.1.5
.
В этом случае проблема состоит в том, что я не переопределял снова переплетать члена средства выделения. Эта версия работы (в VS2008):
template <typename T> class a : public std::allocator<T> {
public:
T* allocate(size_t n, const void* hint = 0) const {
cout << "yo!";
return 0;
}
template <typename U> struct rebind
{
typedef a<U> other;
};
};
int main() {
vector<int, a<int>> v(1000, 42);
return 0;
}
Я нашел это путем отладки через заголовки STL.
Работает ли это или не будет абсолютно зависеть от реализации STL, хотя, таким образом, я думаю, что в конечном счете, Klaim является правильным в этом, что это не должно быть сделано этот путь.
У меня есть два шаблона для создания специализированных средств выделения; первые работы автоволшебно, если это используется на пользовательском типе:
template<>
class std::allocator<MY_TYPE>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef MY_TYPE* pointer;
typedef const MY_TYPE* const_pointer;
typedef MY_TYPE& reference;
typedef const MY_TYPE& const_reference;
typedef MY_TYPE value_type;
template <class U>
struct rebind
{
typedef std::allocator<U> other;
};
pointer allocate(size_type n, std::allocator<void>::const_pointer hint = 0)
{
return reinterpret_cast<pointer>(ALLOC_FUNC(n * sizeof(T)));
}
void construct(pointer p, const_reference val)
{
::new(p) T(val);
}
void destroy(pointer p)
{
p->~T();
}
void deallocate(pointer p, size_type n)
{
FREE_FUNC(p);
}
size_type max_size() const throw()
{
// return ~size_type(0); -- Error, fixed according to Constantin's comment
return std::numeric_limits<size_t>::max()/sizeof(MY_TYPE);
}
};
Второе используется, когда мы хотим иметь наше собственное средство выделения для предварительно определенного типа со стандартным средством выделения, например, символ, wchar_t, станд.:: строка, и т.д.:
namespace MY_NAMESPACE
{
template <class T> class allocator;
// specialize for void:
template <>
class allocator<void>
{
public:
typedef void* pointer;
typedef const void* const_pointer;
// reference to void members are impossible.
typedef void value_type;
template <class U>
struct rebind
{
typedef allocator<U> other;
};
};
template <class T>
class allocator
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type;
template <class U>
struct rebind
{
typedef allocator<U> other;
};
allocator() throw()
{
}
template <class U>
allocator(const allocator<U>& u) throw()
{
}
~allocator() throw()
{
}
pointer address(reference r) const
{
return &r;
}
const_pointer address(const_reference r) const
{
return &r;
}
size_type max_size() const throw()
{
// return ~size_type(0); -- Error, fixed according to Constantin's comment
return std::numeric_limits<size_t>::max()/sizeof(T);
}
pointer allocate(size_type n, allocator<void>::const_pointer hint = 0)
{
return reinterpret_cast<pointer>(ALLOC_FUNC(n * sizeof(T)));
}
void deallocate(pointer p, size_type n)
{
FREE_FUNC(p);
}
void construct(pointer p, const_reference val)
{
::new(p) T(val);
}
void destroy(pointer p)
{
p->~T();
}
};
template <class T1, class T2>
inline
bool operator==(const allocator<T1>& a1, const allocator<T2>& a2) throw()
{
return true;
}
template <class T1, class T2>
inline
bool operator!=(const allocator<T1>& a1, const allocator<T2>& a2) throw()
{
return false;
}
}
Первый шаблон выше, для Вашего собственного определенного типа, не требует дальнейшей обработки, но используется автоматически стандартными контейнерными классами. Второй шаблон требует дальнейшей работы при использовании на стандартном типе. Для станд.:: строка, например, нужно использовать следующую конструкцию при объявлении переменных того типа (это является самым простым с определением типа):
std::basic_string<char>, std::char_traits<char>, MY_NAMESPACE::allocator<char> >
Следующая печать кода "эй" как ожидалось - что Вы видели, была нашим старым другом "неопределенное поведение".
#include <iostream>
#include <vector>
using namespace std;
template <typename T> class a : public std::allocator<T> {
public:
T* allocate(size_t n, const void* hint = 0) const {
cout << "yo!";
return new T[10000];
}
};
int main()
{
vector<int, a<int> > v(1000, 42);
return 0;
}
Править: Я просто проверил Стандарт C++ относительно средства выделения по умолчанию. Нет никакого запрета на наследование от него. На самом деле, насколько я знаю, нет такого запрета ни в какой части Стандарта.